当我做gdb bt时 - 我看到一些帧以地址开头而有些帧没有 - 为什么有些函数不以地址开头
#6 0x000000000041fd1d in func (argc=0, argv=0x8723a0, t=<value optimized out>) at file1.c:55
#7 record (argc=0, argv=0x8723a0, x=<value optimized out>) at file3.c:11
答案 0 :(得分:1)
我相信record()
是内联的,并且是另一个函数的一部分,它是一个上框架而func()
没有内联。我猜是gdb
选择以这种方式显示内联函数,如果它有符号信息。我用gdb 7.0。似乎早期版本的gdb没有以这种方式显示内联函数。
看,我和bt的情况大致相同:
Thread 1 (Thread 1405):
#0 0x00002ac752a93d17 in allocate (this=0x3716b1e0, __in_chrg=<value optimized out>) at /import/home/bc_prod1/bc/data/daily/PROF_HAS_LIBS_005.00/18.05.2012_15_19_04/i686-redhat-linux_5.0_-64/src/build/xalanc-1.11/xml-xalan/c/src/xalanc/Include/XalanList.hpp:537
#1 getListHead (this=0x3716b1e0, __in_chrg=<value optimized out>) at /import/home/bc_prod1/bc/data/daily/PROF_HAS_LIBS_005.00/18.05.2012_15_19_04/i686-redhat-linux_5.0_-64/src/build/xalanc-1.11/xml-xalan/c/src/xalanc/Include/XalanList.hpp:517
#2 end (this=0x3716b1e0, __in_chrg=<value optimized out>) at /import/home/bc_prod1/bc/data/daily/PROF_HAS_LIBS_005.00/18.05.2012_15_19_04/i686-redhat-linux_5.0_-64/src/build/xalanc-1.11/xml-xalan/c/src/xalanc/Include/XalanList.hpp:282
#3 xalanc_1_11::ICUBridgeCollationCompareFunctorImpl::~ICUBridgeCollationCompareFunctorImpl (this=0x3716b1e0, __in_chrg=<value optimized out>) at /import/home/bc_prod1/bc/data/daily/PROF_HAS_LIBS_005.00/18.05.2012_15_19_04/i686-redhat-linux_5.0_-64/src/build/xalanc-1.11/xml-xalan/c/src/xalanc/ICUBridge/ICUBridgeCollationCompareFunctorImpl.cpp:144
我的解释是,在第1帧的情况getListHead()
中,来自第2帧的end()
被内联,这就是为什么它们没有自己的地址而显示的原因。它们实际上是第3帧函数ICUBridgeCollationCompareFunctorImpl::~ICUBridgeCollationCompareFunctorImpl()
的一部分,它实际上没有内联并且有地址。
顺便说一下,当我为第1帧,第2帧和第3帧disass
时,我得到了相同的输出。