当我的程序崩溃时如何自动生成堆栈跟踪

689

我正在使用GCC编译器在Linux上工作。当我的C++程序崩溃时,我希望它能自动生成一个堆栈跟踪。

我的程序由许多不同的用户运行,它还在Linux、Windows和Macintosh上运行(所有版本都是使用gcc编译的)。

我希望我的程序能够在崩溃时生成堆栈跟踪,并在下次用户运行它时询问他们是否愿意将堆栈跟踪发送给我,以便我可以追踪问题。我可以处理向我发送信息的问题,但我不知道如何生成跟踪字符串。有什么建议吗?


4
backtrace和backtrace_symbols_fd函数不是异步信号安全的。在信号处理程序中不应使用这些函数。 - Parag Bafna
13
backtrace_symbols调用malloc,因此不能在信号处理程序中使用。另外两个函数(backtrace和backtrace_symbols_fd)没有这个问题,并且通常在信号处理程序中使用。 - cmccabe
3
@cmccabe那是不正确的,backtrace_symbols_fd通常不会调用malloc,但如果在其catch_error块中发生错误,则可能会调用。 - Sam Saffron
7
“可能”是指没有POSIX规范涉及backtrace_symbols_fd(或任何backtrace); 然而,GNU / Linux的backtrace_symbols_fd被指定为永远不会调用malloc,如http://linux.die.net/man/3/backtrace_symbols_fd所述。因此,可以安全地假设在Linux上它永远不会调用malloc。 - codetaku
1
在2021年,有没有更好的解决方案来解决这个问题?我只想像Java或Python一样打印堆栈跟踪。 - stackoverflowuser2010
显示剩余2条评论
31个回答

0

我忘记了“apport”的GNOME技术,但我不太了解如何使用它。它用于生成堆栈跟踪和其他诊断信息以进行处理,并可以自动提交错误报告。这绝对值得一试。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接