2

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

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

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

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

4

2 回答 2

1

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

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

于 2013-06-02T12:32:05.807 回答
0

这个问题相当老了,但关于异常我想指出的是,您可以跨平台的方式获得很好的回溯,只使用标准 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"

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

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

于 2019-12-24T14:04:47.413 回答