是否有调用C语言中的堆栈转储的函数?
有人可以提供调用转储当前堆栈的C函数的实现吗?它用于x86 linux系统。它可以通过两种方式调用:由另一个函数显式调用,或者在崩溃后(可能作为陷阱/整数处理程序)调用。输出可以是屏幕显示的,也可以是文件的输出,如参数(句柄)所示。明确说明/解开堆栈的方式/注释显然会非常有帮助。谢谢你。
解决方案
在Adam的回答之后,显示如何执行实际堆栈回溯的源代码位于glib 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
backtrace()函数的文档在GNU LIBC手册中。
嵌套函数调用时,堆栈向下增长并构建一堆堆栈框架。从理论上讲,在程序中的任何给定点,都可以将堆栈帧的序列回溯到原始调用点。 backtrace()函数将堆栈帧从调用点导航到程序的开头,并提供返回地址数组。 glibc库中的backtrace()
实现包含每个平台的特定于平台的代码。
在x86平台上,使用ebp(基本指针)和esp(堆栈指针)CPU寄存器的内容来保存当前堆栈帧和任何给定函数的堆栈指针的地址。指针链并向上移动到初始堆栈帧。这允许收集返回地址序列以构建回溯。
如果我们想了解有关backtrace()如何工作以及如何使用它的更多信息,我建议阅读程序内部的堆栈回溯(LINUX Journal)。
既然我们提到了在x86平台上从信号处理程序执行回溯,我想补充一下亚当的答案,并指导我回答他所链接的问题,以获取有关如何确保信号处理程序的回溯指向目标的详细信息。故障的实际位置。