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



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

谢谢。

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

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

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

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

(与此相关的是,也存在自反汇编库)

我使用这段代码来生成调试堆栈跟踪。它使用libwind获取堆栈跟踪,使用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)

libwind应该在Windows和Mac上工作,但libdwfl是Linux和ELF特有的

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

https://github.com/ianlancetaylor/libbacktrace

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

最新更新