应用程序可以以编程方式生成自己的堆栈跟踪吗?

时间:2011-11-07 01:05:28

标签: c stack-trace

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

感谢。

3 个答案:

答案 0 :(得分:7)

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

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

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

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

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

答案 1 :(得分:5)

我正在使用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特定的。

答案 2 :(得分:1)

Ian Lance Taylor的libbacktrace就是这样做的。它处理堆栈展开并为DWARF调试符号提供支持。

https://github.com/ErwanLegrand/libbacktrace

它只支持ELF。