LoginSignup
14
10

More than 5 years have passed since last update.

addr2lineを使ってスタックトレースから取得したアドレスをソースファイル名と行番号に変換する

Last updated at Posted at 2014-11-27

前書いた記事 ではアドレスからソースコードを割り出すために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

14
10
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
10