Debugging 如何将Solaris 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

假设您有一个如下所示的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
             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进行了测试,只要输出只包含可解析的地址表达式,它就可以工作。任何其他内容,
=
都会给出错误,这是可以理解的。你能给我一个失败的两行例子吗?谢谢