Sunday, August 12, 2012

[Linux] backtrace

使用gdb可以在断点处停下来从而允许我们查看call strack. 可是有时候我们希望在程序里自动的显示当前的call stack --- 比如在异常的时候写到log当中.这时候就需要使用backtrace:
1 使用backtrace
http://www.gnu.org/software/libc/manual/html_node/Backtraces.html
显示出当前call stack 的backtrace: 每一行为一个frame对应的binary和在binary中的地址

Obtained 7 stack frames.
/home/foo/bench_cache() [0x4050f5]
/home/foo/bench_cache() [0x405f4e]
/home/foo/bench_cache() [0x407d8d]
/home/foo/bench_cache() [0x40283a]
/home/foo/bench_cache() [0x402e13]
/lib/libc.so.6(__libc_start_main+0xfe) [0x7fad2481dd8e]
/home/foo/bench_cache() [0x401eb9]
2 使用addrline
addr2line将binary的相对offset地址转化为对应的文件以及行数
$ addr2line -e bench_cache -f 0x4050f5
print_backtrace
/home/foo/bench_util.h:28
参数:
  • -e binary, 指定对应的binary
  • -f, 显示对应的function名称

No comments: