创建崩溃日志

时间:2012-02-18 17:49:36

标签: c++ linux crash logging coredump

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

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

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

1 个答案:

答案 0 :(得分:2)

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

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

这样做的缺点是必须具有用于构建转储可执行文件的确切源代码,以及在构建期间生成的符号数据库(PDB文件)。最重要的是,某些代码可以进行优化,使调试器无法为您提供准确的堆栈跟踪,即使使用符号数据也是如此。

有关详细信息,请参阅MiniDumpWriteDump。如果您打算采用这种方法,最佳做法是在崩溃过程中生成转储,但会生成子进程以转储父进程。

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