有一个函数来调用堆栈转储在C?

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

Solutions Collecting From Web of "有一个函数来调用堆栈转储在C?"

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

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

backtrace()函数的文档在GNU LIBC手册中 。

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

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

如果您想了解更多有关backtrace()如何工作以及如何使用它的信息,我会推荐阅读您的程序中的Stack Backtracing (LINUX Journal)。


既然您提到从x86平台的信号处理程序执行回溯,我想添加到亚当的答案,并指示您对我们的问题,他链接到的问题,以确保从信号处理程序的回溯点指向实际的故障位置。