【问题标题】:C++ simple crash loggingC++ 简单的崩溃日志
【发布时间】:2013-05-28 18:39:52
【问题描述】:

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

  1. 给我一个堆栈跟踪。
  2. 给我一个局部变量列表。
  3. 将这些项目转储到文件中,或将其上传到给定的 URL。

到目前为止,我已经查看了Google breakpad,但不知道如何集成它,而且文档似乎充其量也很差。我已经尝试使用它并设法在 Windows 上构建它,但是一些单元测试失败了,并且没有关于此时该做什么的帮助。另外,我的需求可能有点过分。

我找到了以下站点,该站点详细说明了如何获取堆栈跟踪 GENERATE STACK TRACES ON CRASH PORTABLY IN C++。但我不确定这是否适用于远程系统。我猜这需要调试版本并提供 pdb 文件才能工作? 至于获取局部变量,我还没有找到任何东西。 有谁知道一些可以提供帮助的资源?

【问题讨论】:

    标签: c++ exception logging crash


    【解决方案1】:

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

    现在,它更容易了(尽管我喜欢 Windbg!)您让您的应用程序调用 SetUnhandledExceptionFilter 并编写 .dmp 文件,然后只需双击它以将其加载到 Visual Studio 中。您将需要调试系统上的良好符号(.pdf 文件)来理解转储,但创建您自己的符号服务器(文章中的说明,非常简单),它应该能够找出需要哪些符号任何应用程序。但是,您必须对保存符号进行自律 - 错误的符号比无用更糟糕。

    【讨论】:

    • 感谢您的资源。我应该在我原来的帖子中指出,我也需要为 OSX 构建:/ 我已经使用 google breakpad 更进一步,我可以让它构建和创建 crash_generation_app.exe,但似乎没有任何崩溃处理运行和请求转储总是失败(在 32 位和 64 位版本中)。我不确定是否要完全放弃 google breakpad,因为我可能接近获得我需要的东西(这基本上是一个转储文件并且能够检查它的内容),但我可能无法获得我需要的所有东西我知道:/
    【解决方案2】:

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

    使用std::nested_exception 和std::throw_with_nested

    在 StackOverflow here 和 here 上进行了描述,您可以通过简单地编写一个将重新抛出嵌套异常的适当异常处理程序来在您的代码中获取异常的回溯。 但是,它要求您在要跟踪的函数处插入 try/catch 语句。

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

    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"
    

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

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

    【讨论】:

    • 我认为他想捕捉访问违规、被零除等...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2019-03-24
    • 2012-03-09
    • 1970-01-01
    相关资源
    最近更新 更多