gdb

gdbで動作中のプロセスをデバッグしてみる

gdbを使ってLinux上で既に動作しているアプリケーションをattachしてデバッグしてみる。

今回は例としてsnmpdをほんの少しだけ解析します。環境はLinux(CentOS7)です。

gdbのインストール

gdbが無いと始まらないのでyumでインストールします。

SNMPエージェントのビルド

解析用のsnmpdをソースコードからインストールします。インストール方法はこちらを参照。

シンボルの抽出と削除

インストールしたsnmpdをfileコマンドで調べるとシンボルがそのまま残っているのでstripコマンドでシンボルを削除します。

また、ビルドしたsnmpdからデバッグ用のシンボルファイルを取り出しておきます。

SNMPエージェント起動してgdbでattach

準備が出来たのでSNMPエージェントを起動してgdbで補足してみます。

attach後にdirectoryでソースコードを場所、symbol-fileでシンボル情報をgdbに教えてあげます。

そうしたら、snmpdが周期的に実行するループの処理にブレークポイントを張って動きを見てみましょう。

ちゃんと期待した箇所でブレークしてますね。detachするとsnmpdがgdbの補足から解放されます。
これで起動中のプロセスをgdbでデバッグできることが分かりました。

自動化してみる

実際にやってみるとgdbを起動してから実際に確認するまでにコマンドを打つ操作が多いことが分かります。1回だけなら良いですが何回も同じことをするのはとても面倒です。こういうところは自動化していきましょう。

gdbは-xオプジョンで指定したファイルからgdbのコマンドを入力することができるのでこれを利用します。
外部入力のファイルとしてsnmp_gdb.shを作成します。

snmp_gdb.sh

commands~endの句はbreakポイントに到達した際に自動で実行するコマンドを定義しています。
commandsの書式はcommands <ブレークポイント番号>ですが、引数を省略すると直前に張ったブレークポイントのさ番号になります。

ファイルが作成できたら実際にやってみましょう。

これで期待通りの動作を確認できました。キチンと作ればテストの自動化も出来そうですね。