如何从 libunwind 和地址清理器中获取行号列为<共享对象>+偏移量?



我经常从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选项的说明。

相关内容

最新更新