我正在使用 GCC 编译器在 Linux 上工作。当我的 C++ 程序崩溃时,我希望它自动生成堆栈跟踪。
我的程序由许多不同的用户运行,它也可以在 Linux、Windows 和 Macintosh 上运行(所有版本都使用 gcc
编译)。
我希望我的程序能够在崩溃时生成堆栈跟踪,并且下次用户运行它时,它会询问他们是否可以将堆栈跟踪发送给我,以便我可以追踪问题。我可以处理向我发送信息,但我不知道如何生成跟踪字符串。有任何想法吗?
原文由 KPexEA 发布,翻译遵循 CC BY-SA 4.0 许可协议
对于 Linux,我相信 Mac OS X,如果你使用 gcc,或者任何使用 glibc 的编译器,你可以使用
execinfo.h
中的 backtrace() 函数来打印堆栈跟踪并在你得到一个优雅退出分段故障。文档可以 在 libc 手册 中找到。这是一个示例程序,它安装
SIGSEGV
处理程序并在出现段错误时将堆栈跟踪打印到stderr
。这里的baz()
函数会导致触发处理程序的段错误:使用
-g -rdynamic
编译会在输出中获得符号信息,glibc 可以使用它来制作一个很好的堆栈跟踪:执行这个得到你这个输出:
这显示了堆栈中每个帧来自的加载模块、偏移量和函数。 Here you can see the signal handler on top of the stack, and the libc functions before
main
in addition tomain
,foo
,bar
和baz
。