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

How to convert Solaris MDB addresses into file names and line numbers?

假设您有一个如下所示的 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是可以接受的,你可以直接使用dbxbuilt-in run-time checking。有了可用的调试信息,它会直接告诉你行号。

Studio 套件中还有其他您可能会觉得有用的工具。 bcheck utility 使用相同的底层 dbx 功能来生成相同的数据。

但是请注意,dbxbcheck 内存跟踪可能会显着降低性能,特别是如果您使用 check -all

Performance Analyzer (collect, analyze, er_print, etc) can also provide memory leak 信息的性能损失较低,尽管根据我的经验,该工具套件更适合分析应用程序性能。 (在我看来,它作为一个分析工具让 perf 大吃一惊...)

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

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