2006年7月 9日

gdb の gcore コマンドを使う

デバッガの理論と実装を読んで以来、デバッガをもっと活用しようという意欲がわいてきました。そこで、gdb について調べていると、 gcore (generate-core-file) というコマンドを見つけました。

 

gcore は実行中のプロセスの core を生成する gdb のコマンドです。通常、 core ファイルはプログラムが異常終了したときにカーネルによって生成されますが、gdb の gcore コマンドを使えば実行中のプロセスを終了させることなく core ファイルを生成できます。 gcore コマンドは次のように使います。

% gdb
(gdb) attach PID
(gdb) gcore core
(gdb) detach

まず attach コマンドで PID を指定して実行中のプロセスにアタッチします (gdb -p PID で起動しても OK)。次に、 gcore コマンドで core ファイルを生成します。このとき、任意のファイル名を指定できます。core の生成が終わったらデタッチします。

gdb によってアタッチされたプロセスは gdb による制御下に入り、実行が停止します。 step, next, continue, detach などのコマンドで意図的に実行を再開しない限り、プログラムは完全に停止しています。gcore コマンドのメリットはプログラムの停止時間を最小限に抑えて、デバッグできるところにあります。

たとえば、実行中のサーバプロセスをデバッグしたい場合、ローカル変数などの各種のインスペクションを行うために gdb で長時間アタッチしてその間、サービスを止めてしまうのはできるだけ避けたいところです。このようなとき、 gcore コマンドを使えば、 core を生成したのちにただちにデタッチできるので、サービスの停止時間を最小限に抑えることができます。

core ファイルが生成された後は、 bt, up, down, info locals などのコマンドを使って各種のインスペクションをプロセスからデタッチした状態で行えます。core の生成に要する時間はバイナリおよびプロセスのサイズにもよりますが、小さなプログラムの場合は一瞬です。

gdb のパッケージには gdb_gcore.sh というスクリプトが含まれており、attatch, gcore, detatch をバッチで実行します。手作業でこれらのコマンドを実行するよりもこのスクリプトを使ったほうがいいでしょう。Linuxディストリビューションによっては gcore というコマンド名で /usr/bin などにインストールされているものもあるようです。

gdb のソースコードを見ると gcore は BFD ライブラリを駆使してユーザレベルでコアダンプを行っています。ユーザレベルでコアダンプを行うプログラムとしては、 Google Coredumper というものもあります。こちらはライブラリとして使えるという点が主な特徴です。

まとめ

gdb の gcore コマンドについて紹介しました。実行中のプロセスをできるだけ停止させずにデバッグしたいというときに役立つのではないかと思います。