c++简单的崩溃日志

C++ simple crash logging

本文关键字:日志 崩溃 简单 c++      更新时间:2023-10-16

我正在为一个3D应用程序编写一个插件(基本上是一个dll),偶尔会出现崩溃。有时这些很难找到,我想投入一些时间来制作(或集成一个现有的)崩溃记录器,它将

    给我一个堆栈跟踪。
  1. 给我一个本地变量列表
  2. 将这些条目转储到文件中,或者上传到指定的URL。
到目前为止,我已经看过了Google breakpad,但是不知道如何集成它,而且文档看起来很差。我尝试过使用它,并设法在windows上构建它,但是一些单元测试失败了,在这一点上没有任何帮助。而且,对于我的需要来说可能有点多。

我找到了下面的网站,详细介绍了如何在c++中获得堆栈跟踪。但我不确定这是否能在远程系统上工作。我猜这将需要是调试版本,并提供pdb文件为此工作?至于获得局部变量,我还没有设法找到任何东西。有人知道有什么资源可以帮上忙吗?

这篇文章虽然写于2002年,但仍然与事后调试相关。它向您展示了使其工作所需的所有原因、步骤和设计。

现在,它更容易(虽然我喜欢Windbg!)你让你的应用程序调用SetUnhandledExceptionFilter并编写。dmp文件,然后只需双击它加载到Visual Studio中。在调试系统中,你需要好的符号(.pdf文件)来理解转储,但是创建你自己的符号服务器(文章中的说明,非常简单),它应该能够找出任何应用程序需要哪些符号。你必须严格遵守保存符号的规则——错误的符号比无用的符号更糟糕。

这个问题相当老了,但是关于异常,我想指出的是,您可以通过跨平台的方式获得很好的回溯,只使用标准c++ 11,而不需要调试器或繁琐的日志记录:

使用std::nested_exceptionstd::throw_with_nested

在这里和这里的StackOverflow上描述了如何通过简单地编写一个适当的异常处理程序来重新抛出嵌套异常,从而在代码中获得异常的回溯。但是,它将要求您在希望跟踪的函数中插入try/catch语句。

由于您可以对任何派生异常类执行此操作,因此您可以向此类回溯中添加大量信息!你也可以看看我在GitHub上的MWE或我的"trace"库,其中的反向跟踪看起来像这样:

Library API: Exception caught in function 'api_function'
Backtrace:
~/Git/mwe-cpp-exception/src/detail/Library.cpp:17 : library_function failed
~/Git/mwe-cpp-exception/src/detail/Library.cpp:13 : could not open file "nonexistent.txt"

关于局部变量,在这种方法中,您必须手动将希望以某种形式打印的变量放入异常或异常消息中,这将非常麻烦…

将你记录的内容写入文件并将其上传到某处是另一个问题,对此我没有任何具体的建议。