【问题标题】:Can an application programmatically generate its own stacktrace?应用程序能否以编程方式生成自己的堆栈跟踪?
【发布时间】:2011-12-23 07:44:52
【问题描述】:

我有一个用 C 语言编写的程序,可以在 Linux、MacOS 和 Windows 上运行。有没有办法可以调用函数并生成堆栈跟踪?这对我来说非常有用。理想情况下,我想在所有三个平台上都这样做,但 Linux 是最重要的。 (Windows 正在通过 mingw 编译。)

谢谢。

【问题讨论】:

    标签: c stack-trace


    【解决方案1】:

    例如,在 GCC 和 GNU libc C 库中,您可以使用 backtrace()

    正如@slugonamission 所建议的,Windows 提供CaptureStackBackTrace() - 谢谢!

    其他平台可能提供类似的功能。

    (这显然是一个平台相关的问题。)

    (在相关说明中,也存在self-disassembly libraries。)

    【讨论】:

    • 对于 Windows,这篇旧帖子可能会有所帮助:POST
    • @slugonamission:谢谢,已添加!
    • 这是一个 similar backtrace suggestion,其中包括对 addr2line 程序的引用,用于将偏移量转换为文件名和行号。
    【解决方案2】:

    我正在使用this code 生成调试堆栈跟踪。它使用libunwind 获取堆栈跟踪,使用libdwfl 读取调试信息。

    它可以生成类似于 Java 的堆栈跟踪,带有函数名称和源位置。例如:

    at c(stack_trace.c:95)
    at b(stack_trace.c:100)
    at a(stack_trace.c:105)
    at main(stack_trace.c:110)
    

    libunwind 应该可以在 Windows 和 Mac 上运行,但 libdwfl 是 Linux 和 ELF 特定的。

    【讨论】:

    • 谢谢。我下载了 libunwind,但它没有在我的 Mac 上编译。
    • @vy32 你是对的。事实证明它们都是特定于 Linux 的。
    • 程序崩溃时能否使用libunwind生成回溯?
    • @PriteshAcharya Just print the stacktrace in SIGSEGV signal handler。不过要小心这段代码。它充满了未定义的行为。
    • 是的。我不想在 SIGSEGV 处理程序中获得新的 SIGSEGV。 :D
    【解决方案3】:

    Ian Lance Taylor 的 libbacktrace 做到了这一点。它处理堆栈展开并提供对 DWARF 调试符号的支持。

    https://github.com/ianlancetaylor/libbacktrace

    截至 2020 年 10 月,libbacktrace 支持带有 DWARF 调试信息的 ELF、PE/COFF、Mach-O 和 XCOFF 可执行文件。换句话说,它支持 GNU/Linux、*BSD、macOS、Windows 和 AIX。编写该库是为了方便地添加对其他目标文件和调试格式的支持。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-10
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多