我经常从libunwind或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,但我想这适用于任何平台。
发布于 2014-04-23 14:16:46
(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应该行得通。
发布于 2014-04-30 09:49:55
有关使用http://clang.llvm.org/docs/AddressSanitizer.html脚本和/或symbolize=true选项的说明,请参阅symbolize=true。
https://stackoverflow.com/questions/23240817
复制相似问题