是否有一个函数来调用C中的堆栈转储?

时间:2008-10-03 17:16:11

标签: c linux debugging exception

有人可以提供一个被调用来转储当前堆栈的C函数的实现吗?它适用于x86 linux系统。它可以通过两种方式调用:由另一个函数显式调用,或者在崩溃之后(可能作为陷阱/ int处理程序)。输出可以是屏幕或文件,如参数(句柄)所示。关于如何展开堆栈的明确解释/评论显然会非常有帮助。谢谢。

3 个答案:

答案 0 :(得分:2)

关于Adam的回答,显示如何执行实际堆栈回溯的源代码在gnu libc的backtrace()中,在/libc/debug/backtrace.c下 - 不确定stackoverflow是否接受下面的完整链接HTML过滤器......

http://cvs.savannah.gnu.org/viewvc/*checkout*/libc/debug/backtrace.c?root=libc&revision=1.1.2.1&content-type=text%2Fplain

答案 1 :(得分:2)

backtrace()函数的文档位于GNU LIBC MANUAL

答案 2 :(得分:0)

当嵌套函数调用时,堆栈向下增长并构建一堆堆栈帧。在程序中的任何给定点,理论上可以将堆栈帧序列回溯到原始调用点。 backtrace()函数将堆栈帧从调用点导航到程序的开头,并提供返回地址数组。 glibc库中backtrace()的实现包含每个平台的特定于平台的代码。

在x86平台的情况下,使用ebp(基指针)和esp(堆栈指针)CPU寄存器的内容,它们保存当前堆栈帧的地址和任何给定函数的堆栈指针的地址。跟随指针链并向上移动到初始堆栈框架。这允许收集返回地址序列以构建回溯。

如果您想了解有关backtrace()如何运作以及如何使用它的更多信息,建议您阅读 Stack Backtracing Inside Your Program (LINUX报)。


由于您提到从x86平台的信号处理程序执行回溯,我想添加到Adam's answer并引导您到 my response 查看他关联的问题有关如何确保信号处理程序的回溯指向故障的实际位置的详细信息。

相关问题