如何将 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
是可以接受的,你可以直接使用dbx
的built-in run-time checking。有了可用的调试信息,它会直接告诉你行号。
Studio 套件中还有其他您可能会觉得有用的工具。 bcheck
utility 使用相同的底层 dbx
功能来生成相同的数据。
但是请注意,dbx
和 bcheck
内存跟踪可能会显着降低性能,特别是如果您使用 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
假设您有一个如下所示的 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
的built-in run-time checking。有了可用的调试信息,它会直接告诉你行号。
Studio 套件中还有其他您可能会觉得有用的工具。 bcheck
utility 使用相同的底层 dbx
功能来生成相同的数据。
但是请注意,dbx
和 bcheck
内存跟踪可能会显着降低性能,特别是如果您使用 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