首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从libunwind和AddressSanitizer中获得行号,它们被列为<shared object>+offset?

如何从libunwind和AddressSanitizer中获得行号,它们被列为<shared object>+offset?
EN

Stack Overflow用户
提问于 2014-04-23 09:54:01
回答 2查看 1.5K关注 0票数 2

我经常从libunwind或AddressSanitizer获得这样的堆栈跟踪:

代码语言:javascript
复制
#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附加到仍然存在的过程中,我可以使用它获得有关位置的详细信息:

代码语言:javascript
复制
(gdb) list *0x7ffff4b47063

但是,如果进程已经死亡,我不能仅仅在gdb下重新启动它并使用上面的方法,因为地址随机化会使我得到错误的结果(至少,这是我的假设;我显然没有得到有意义的位置)。所以,我试过

代码语言:javascript
复制
% 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,但我想这适用于任何平台。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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偏移量可以进行调整。

代码语言:javascript
复制
readelf -WS libswipl.so.7.1.13 | grep '\.text'

相反,使用addr2line可能更容易。有点像

代码语言:javascript
复制
addr2line -fe libswipl.so.7.1.13 0x1f5063 0x1da783

应该行得通。

票数 2
EN

Stack Overflow用户

发布于 2014-04-30 09:49:55

有关使用http://clang.llvm.org/docs/AddressSanitizer.html脚本和/或symbolize=true选项的说明,请参阅symbolize=true。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23240817

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档