正在创建故障日志

Creating a Crash Log

本文关键字:日志 故障 创建      更新时间:2023-10-16

当我想找到导致程序崩溃的segfault或任何其他错误时,我总是用gdb检查核心转储。当这样的应用程序在没有安装gdb的计算机上运行时,这是非常痛苦的。

所以几天前,我使用了一个程序(JDownloader),该程序编写了一个崩溃日志文件,该文件包含一个堆栈跟踪。我认为这将是对我的应用程序的一个很大的增强。但我还没有找到任何关于如何在崩溃前编写一个包含stacktrace的文件的信息。

这可能吗?如何在Linux/Windows上执行此操作?我正在使用C/C++。

我相信JDownloader是用Java编写的。我认为该语言允许您在任何时候检索完整的纯文本堆栈跟踪。C++无法做到这一点,因为编译后的可执行文件通常不会保存任何关于生成它的代码的信息

Windows API允许您捕获致命异常并创建进程的转储(如果您不想处理大型文件,则创建进程的一部分)。然后可以使用windbg、Visual Studio或您选择的调试器来检查此转储。

这样做的缺点是必须具有用于生成转储可执行文件的确切源代码,以及在生成过程中生成的符号数据库(PDB文件)。除此之外,一些代码的优化方式使调试器无法为您提供准确的堆栈跟踪,即使使用符号数据也是如此。

有关详细信息,请参阅MiniDumpWriteDump。如果要采用此路线,最佳做法是而不是在崩溃过程中生成转储,而是生成一个子进程来转储父进程。

还有一些C和C++库可以"手动"记录调用堆栈,并在运行时为您提供它的文本表示,但我还没有遇到任何建议。