我正在使用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来获得这种回溯?能给我举个例子? (我没有原始代码)。
答案 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