【发布时间】:2011-05-19 22:45:34
【问题描述】:
我把整个问题分成了几个小问题:
- GDB 能够使用哪些不同的算法来重建堆栈跟踪?
- 每个堆栈跟踪重建算法在高层次上如何工作?优点和缺点?
- 需要在程序中提供什么样的元信息编译器才能使每个堆栈跟踪重建算法工作?
- 还有启用/禁用特定算法的相应 g++ 编译器开关?
【问题讨论】:
-
en.wikipedia.org/wiki/Call_stack,编译器将调试信息映射代码偏移添加到源代码行。
-
那篇维基百科文章除了简单的“在调用另一个函数时将 RBP 存储到堆栈中”之外,没有详细介绍其他算法。例如,如果 -fomit-frame-pointer 在编译时设置,该算法将不再起作用。堆栈展开描述符呢?那是如何用于重建堆栈跟踪的?还有其他算法吗?
-
与
-fomit-frame-pointerGDB 被排便。 -
没有 GDB 不使用 -fomit-frame-pointer。当您正在调试的程序崩溃时,在 GDB 中尝试 BT 命令 - 它仍然会生成正确的回溯。我想这与展开描述符有关,它仍然允许重建堆栈跟踪。
-
来自
man gcc: "-fomit-frame-pointer 不要将帧指针保存在不需要的函数的寄存器中。这样可以避免指令保存、设置和恢复帧指针;它还在许多功能中提供了一个额外的寄存器。它还使得在某些机器上无法调试。叶函数被大便了。
标签: gdb g++ stack-trace