【问题标题】:Is there a function to invoke a stack dump in C?是否有在 C 中调用堆栈转储的函数?
【发布时间】:2010-09-15 03:20:36
【问题描述】:

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

【问题讨论】:

  • 您是直接查找调用堆栈的文本输出,还是二进制核心转储也适合您?
  • 我在考虑文本输出;似乎在 gnu 的 libc 案例中, backtrace() 提供了 bin 输出,而 backtrace_symbols() 提供了文本输出。

标签: c linux debugging exception


【解决方案1】:

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

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

如果您想了解更多关于backtrace() 工作原理和使用方法的信息,我建议您阅读Stack Backtracing Inside Your Program(LINUX 期刊)。


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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      根据 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

      【讨论】:

        猜你喜欢
        • 2013-10-12
        • 2013-04-24
        • 1970-01-01
        • 2021-10-27
        • 2012-05-01
        • 2010-11-22
        • 2021-03-19
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多