http://www.wuzesheng.com/?p=1804
:~> c++filt _Z16print_stacktracev
print_stacktrace()
nm命令介绍的很多,但大多不介绍其函数符号标志的含义。
最近在调试动态库时常用到,其中用的最多的用法:
nm -A * |grep “aaa” | c++filt // -A 为了显示文件, c++filt转换为可读风格,好像有个参数也能实现类似功能
对于每一个符号,nm列出其值(the symbol value),类型(the symbol type)和其名字(the symbol name)。
如下例:
00000024 T cleanup_before_linux
00000018 T cpu_init
00000060 T dcache_disable
00000054 T dcache_enable
0000006c T dcache_status
00000000 T do_reset
0000003c T icache_disable
00000030 T icache_enable
00000048 T icache_status
上面的显示是使用nm cpu.o的输出,对于cleanup_before_linux这个符号来说,00000024是以16进制显示的其值,T为其类型,而cleanup_before_linux是其名字。可以看出,上面显示的cleanup_before_linux这个symbol的值实际上是该函数在text section中的偏移。但是,每个符号的值的具体含义依其类型而异。当然,对于每个符号的值,其类型、其值以及它们所属的section是密切相关的。
下面说明符号类型:对于每一个符号来说,其类型如果是小写的,则表明该符号是local的;大写则表明该符号是global(external)的。
前几天帮同事跟踪的一个程序莫名退出,没有core dump(当然ulimit是打开的)的问题。我们知道,正常情况下,如果程序因为某种异常条件退出的话,应该会产生core dump,而如果程序正常退出的话,应该是直接或者间接的调用了exit()相关的