2008-10-03 43 views
3

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

+0

您是直接寻找调用堆栈的文本输出还是二进制核心转储也适用于您? – 2008-10-03 18:01:49

回答

0

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

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

如果你想知道如何backtrace()工作以及如何使用它,我会推荐阅读Stack Backtracing Inside Your Program(Linux杂志)的更多信息。


既然你提到执行从一个x86平台的信号处理回溯,我想向您添加到Adam's answer并直接向my response的问题,他挂了如何确保回溯细节从信号处理程序指向故障的实际位置。

相关问题