前書いた記事 ではアドレスからソースコードを割り出すためにobjdumpを使っていましたが、
それではプログラムが大きいほど遅くなります。
今日はaddr2lineコマンドを紹介します。
ソースサンプルは前書いた記事にあるます。
実行結果
./a.out() [0x401768]
./a.out() [0x4017e9]
./a.out() [0x401804]
/lib64/libc.so.6(__libc_start_main+0xfd) [0x318441ed5d]
./a.out() [0x4012a9]
この実行結果からコースコードを割り出すには以下のコマンドを使います
addr2line -e a.out -f -C -s 0x401768 0x4017e9 0x401804
パラメータの意味
-e 実行ファイルの位置を指定、デフォルトはa.out
-f 関数の名前を表示する
-C c++のシンボル(関数の名前)を見やすくする
-s ファイル名のみを表示する(つけないと絶対パスを表示する)
実行結果
hogehoge()
1.cpp:52
hoge()
1.cpp:57
main
1.cpp:60
もし実行結果に??がありましたら、それはアドレスが違ってるか、それともコンパイルの時-gをつけていなかったかのどちらです。
このコマンドは一瞬で実行が終わります、これでデバッグの時はもっと捗りますね。
仕事で使う時デバッグ情報ありとなしのファイルを分けるコマンド
cp a.out a.out.debuginfo
strip a.out
gitのコミット番号もつけたいなら
cp a.out "a.out.debuginfo.`git log -n 1 --pretty=format:%H`"
strip a.out
~~~
そのあとa.outを公開して、バグレポートをもらったらa.out.debuginfoを使ってソースコードの位置を割り出せばおkです。
manページ
http://linuxjm.sourceforge.jp/html/GNU_binutils/man1/addr2line.1.html