Debugging 如何将Solaris MDB地址转换为文件名和行号?
假设您有一个如下所示的MDB堆栈跟踪:Debugging 如何将Solaris MDB地址转换为文件名和行号?,debugging,solaris,Debugging,Solaris,假设您有一个如下所示的MDB堆栈跟踪: libumem.so.1`vmem_seg_alloc+0x170 libumem.so.1`vmem_xalloc+0x628 libumem.so.1`vmem_alloc+0x1f8 libumem.so.1`umem_alloc+0xec libumem.so.1`malloc+0x40 com
libumem.so.1`vmem_seg_alloc+0x170
libumem.so.1`vmem_xalloc+0x628
libumem.so.1`vmem_alloc+0x1f8
libumem.so.1`umem_alloc+0xec
libumem.so.1`malloc+0x40
compute+0x14
main+0x54
_start+0x12c
例如,将::vmem_seg-v
应用于::findleaks
列出的地址时生成的堆栈跟踪
相应的二进制文件包含调试符号,因此将类似compute+0x14
的地址转换为文件名和行号应该非常容易
我该怎么做
如果MDB不直接支持这一点,那么使用其他工具(如dbx)也可以
实用工具
gaddr2line
似乎不理解compute+0x14
,因为dbx
是可以接受的,所以您可以使用dbx
。有了调试信息,这将直接告诉您行号
Studio套件中还有其他一些工具,您可能会发现它们很有用。使用相同的底层dbx
功能生成相同的数据
但是,请注意,dbx
和bcheck
内存跟踪可能会造成严重的性能损失,特别是如果使用check-all
(收集、分析、er_打印等)也可以以较低的性能代价提供信息,尽管根据我的经验,该工具套件更倾向于分析应用程序性能。(在我看来,它作为一种分析工具将
perf
吹走了…您可以通过管道将地址表达式列表传输到=K
以将其转换为指针大小的十六进制数。这些数字将全部放在一行上,然后可以通过shell管道传输到xargs gaddr2line
::your_dcmds | = K ! xargs gaddr2line -e executablename
我知道dbx的
check-leaks
功能,它确实直接显示文件名和行号。但在某些情况下,您无法使用dbx进行泄漏检测:例如,当泄漏仅发生在生产环境中,并且a)dbx在生产环境中不可用,或者b)RTC的开销过高。使用MDB,您甚至可以对通过gcore
生成的核心文件运行::findleaks
命令。因此,在这些情况下,您确实需要转换这些MDB堆栈跟踪。也许dbx可以用来做地址转换?是的,但你在问题中确实说过“使用其他工具,如dbx,也可以”。我确实说过“使用其他工具,如dbx,也可以”,这可以理解为:使用dbx转换MDB样式的地址是可以的。在实际的泄漏收集/检测过程中使用DBX不是一个选项。我没有尝试过这一点,但是通过管道传输到=K
将每个地址表达式转换为指针大小的十六进制数,然后通过管道传输到shell命令!gaddr2line-e executablename
可以执行您想要的操作。@MarkPlotnick,是的,这是有效的,即在mdb提示符处输入compute+0x14=K
将打印gaddr2line理解的100000afc
。如果您将您的评论作为答案发布,我将投票并接受。当您的\u dcmds生成多行时(例如,123::bufctl\u audit
,它编写堆栈跟踪),这不起作用。@maxschlepzig我使用生成多行的dcmds进行了测试,只要输出只包含可解析的地址表达式,它就可以工作。任何其他内容,=
都会给出错误,这是可以理解的。你能给我一个失败的两行例子吗?谢谢