如何将Solaris MDB地址转换为文件名和行号?

时间:2015-06-16 19:53:51

标签: 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
             compute+0x14
             main+0x54
             _start+0x12c

例如,将::vmem_seg -v应用于::findleaks列出的地址时生成的堆栈跟踪。

相应的二进制文件包含调试符号,因此将compute+0x14之类的地址转换为文件名和行号非常容易。

我该怎么做?

如果MDB不直接支持这一点 - 使用像dbx这样的其他工具也可以。

实用程序gaddr2line似乎无法理解compute+0x14

2 个答案:

答案 0 :(得分:1)

由于dbx可以接受,您可以使用dbx的{​​{3}}。有了可用的调试信息,它将直接告诉您行号。

Studio套件中还有其他工具可供您使用。 built-in run-time checking使用相同的基础dbx功能来生成相同的数据。

请注意,dbxbcheck内存跟踪可能会对性能造成严重影响,尤其是在使用check -all时。

bcheck utility(收集,分析,er_print等)也可以以较低的性能损失提供Performance Analyzer信息,尽管根据我的经验,工具套件更适合分析应用程序性能。 (而且IMO它将perf作为分析工具吹走......)

答案 1 :(得分:1)

您可以将地址表达式列表传递给= K,将它们转换为指针大小的十六进制数字。这些数字将全部放在一行,然后可以通过shell管道传输到xargs gaddr2line

::your_dcmds | = K ! xargs gaddr2line -e executablename