我经常从libunfold或AddressSanitizer获得堆栈跟踪,如下所示:
#12 0x7ffff4b47063 (/home/janw/src/pl-devel/lib/x86_64-linux/libswipl.so.7.1.13+0x1f5063)
#13 0x7ffff4b2c783 (/home/janw/src/pl-devel/lib/x86_64-linux/libswipl.so.7.1.13+0x1da783)
#14 0x7ffff4b2cca4 (/home/janw/src/pl-devel/lib/x86_64-linux/libswipl.so.7.1.13+0x1daca4)
#15 0x7ffff4b2cf42 (/home/janw/src/pl-devel/lib/x86_64-linux/libswipl.so.7.1.13+0x1daf42)
我知道,如果我在静物过程中附加了gdb,我可以使用它来获取细节位置:
(gdb) list *0x7ffff4b47063
但是如果这个过程已经死了,我不能在gdb下重新启动它并使用上面的方法,因为地址随机化使我得到错误的结果(至少,这是我的假设;我显然没有找到有意义的地点)。所以,我试过
% gdb program
% run
<get to the place everything is loaded and type Control-C>
(gdb) info shared
<Dumps mapping location of shared objects>
(gdb) list *(<base of libswipl.so.7.1.13>+0x1f5063)
但是,这要么没有列出任何内容,要么显然是错误的位置。这听起来很简单,但是我没有找到答案:-(平台是64位Linux,但我想这适用于任何平台。
(gdb) info shared
<Dumps mapping location of shared objects>
不幸的是,上面并没有转储可用于以下操作的实际映射位置:
libswipl.so.7.1.13+0x1f5063
(正如你所发现的)。相反,GDB输出列出了.text
部分的映射位置,而不是ELF二进制文件本身的映射位置。
您可以通过在中找到.text
偏移量来进行调整
readelf -WS libswipl.so.7.1.13 | grep '.text'
使用addr2line
可能更容易。类似的东西
addr2line -fe libswipl.so.7.1.13 0x1f5063 0x1da783
应该起作用。
请参阅http://clang.llvm.org/docs/AddressSanitizer.html有关使用asan_symbolize.py脚本和/或symbole=true选项的说明。