gdb について調べていると、 gcoreというコマンドを見つけました。
gcore は実行中のプロセスの core を生成する gdb のコマンドです。
通常、 core ファイルはプログラムが異常終了したときにカーネルによって生成されますが、
gdb の gcore コマンドを使えば実行中のプロセスを終了させることなく core ファイルを生成できます。
gcore コマンドは次のように使います。
実行例
# gdb
(gdb) attach PID
(gdb) gcore core
(gdb) detach
まず attach コマンドで PID を指定して実行中のプロセスにアタッチします。次に、 gcore コマンドで core ファイルを生成します。このとき、任意のファイル名を指定できます。core の生成が終わったらデタッチします。
gdb によってアタッチされたプロセスは gdb による制御下に入り、実行が停止します。 step, next, continue, detach などのコマンドで意図的に実行を再開しない限り、プログラムは完全に停止しています。gcore コマンドのメリットはプログラムの停止時間を最小限に抑えて、デバッグできるところにあります。
たとえば、実行中のサーバプロセスをデバッグしたい場合、ローカル変数などの各種のインスペクションを行うために gdb で長時間アタッチしてその間、サービスを止めてしまうのはできるだけ避けたいところです。このようなとき、 gcore コマンドを使えば、 core を生成したのちにただちにデタッチできるので、サービスの停止時間を最小限に抑えることができます。
コアファイルデバッグ
# BackTrace
(gdb) bt
# 関数指定
(gdb) frame 0
# 変数表示
(gdb) p var
# ソースプログラムを表示
(gdb) list
# ステップアウト実行
(gdb) next
# ステップイン実行
(gdb) step
その他
gdb のパッケージには gdb_gcore.sh というスクリプトが含まれており、attatch, gcore, detatch をバッチで実行します。手作業でこれらのコマンドを実行するよりもこのスクリプトを使ったほうがいいでしょう。Linuxディストリビューションによっては gcore というコマンド名で /usr/bin などにインストールされているものもあるようです。
まとめ
gdb の gcore コマンドについて紹介しました。実行中のプロセスをできるだけ停止させずにデバッグしたいというときに役立つのではないかと思います。