另一个内联函数的示例

时间:2014-06-19 20:07:35

标签: gdb frame inline backtrace

我正在使用gdb调试核心文件。当我运行backtrace命令时,我得到了类似的东西:

#0 0x0056e41e in <<function1>>
#1 0x0057224c in <<function2>>
#2 <<function3>>
#3 0x00580ba4 in <<function4>>

所以,当我在第1帧和第2帧上运行信息帧时,我得到了:

(gdb) info frame 1
Stack frame at 0x2f7cc9c0:
pc = 0x591670 in <<function2>>
saved pc 0x5917fc
inlined into frame 2 [...]

(gdb) info frame 2
Stack frame at 0x2f7cc9c0:
pc = 0x591670 in <<function3>> [...]

所以,仅仅出于教育目的,如何实现function2和function3来获得这种回溯?能给我举个例子? (我没有原始代码)。

1 个答案:

答案 0 :(得分:0)

这很容易,特别是如果你阅读11.1 Inline Functions。以下是一个例子。

源文件(inlined.cpp)。函数实际上应该做一些有用的事情,以免被优化器抛弃。

#include <iostream>

static void
printIt()
{
    std::cout << "Hi." << std::endl;
}

int
main(void)
{
    printIt();
    return 0;
}

编译优化和调试信息:

g++ -g -O1 -o inline inline.cpp 

调试(缩短)。在printIt()上放置断点可能也不适合你,需要进入内联函数以实际到达它的主体(阅读页面顶部链接的页面)。

gdb ./inline
> b main
> r
> s
> s
6           std::cout << "Hi." << std::endl;
(gdb) info frame 0
Stack frame at 0x7fffffffded0:
 rip = 0x40088c in printIt (inline.cpp:6); saved rip 0x7ffff7217d85
 inlined into frame 1
 source language c++.
 Arglist at unknown address.
 Locals at unknown address, Previous frame's sp in rsp