2

当我执行 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
4

1 回答 1

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

我的解释是,在我的情况下,从第getListHead()1 帧开始,end()从第 2 帧开始内联,这就是为什么它们显示时没有自己的地址。它们实际上是第 3 帧函数的一部分,ICUBridgeCollationCompareFunctorImpl::~ICUBridgeCollationCompareFunctorImpl()该函数实际上没有内联并且有它的地址。

顺便说一句,当我disass为第 1 帧、第 2 帧和第 3 帧做时,我得到了相同的输出。

于 2013-01-31T08:42:37.347 回答