用于MinGW应用程序的崩溃报告

24

我有一个使用MinGW编译的C++应用程序,收到了客户的崩溃投诉。因此,在发布新版本之前,我已经在可能崩溃的部分进行了大量日志记录,并寻找了一个崩溃报告工具,以便在出现错误时找到堆栈跟踪和其他有用的调试信息。

是否存在与MinGW应用程序兼容的这样的工具?(似乎编译器和崩溃报告策略之间存在密切联系,因此才问这个问题)。

有没有 Windows 工具可以帮助我? 应用程序主要在 Windows XP 机器上运行。

能够将信息写入文件对我的目的来说已经足够了。然后我可以要求客户将信息通过邮件发送给我。

我一直在研究google-breakpadSetUnhandledExceptionFilter,但我仍然不知道它们是否有任何用处。其他崩溃报告工具,例如crashrpt,是为Visual C++设计的,因此我想尝试在MinGW上使用它们并没有多少意义。

编辑:关于这个问题的一些有用链接

  • mingw下的核心转储
  • 在Mingw32上创建和读取gdb核心转储
  • 使用MinGW + GDB进行死后调试

  • 你使用的是哪个集成开发环境(IDE)?如果你使用的是记事本,考虑免费下载QT框架和QTCreator,它默认在Windows上使用MinGW,并具有调试功能。 - AJG85
    1
    谢谢,但我正在寻找一个崩溃报告程序,能够让我调试在客户计算机上已安装的程序。 - Jong Bor Lee
    1个回答

    15

    实际上,问题不在于使崩溃报告工作。使用DbgHelp库函数和其中最重要的MiniDumpWriteDump几乎是微不足道的。但请记住,在旧系统上重新分发DbgHelp库,并观察您打算调用的函数的版本要求-新版本的Windows至少带有此库的某个版本。

    如果您使用非MS编译器(例如Embarcadero,前Borland产品或Watcom),则您遇到的问题是创建的调试符号对DbgHelp库毫无意义-它是在Windows上进行调试的标准设施。 PDB格式在很大程度上未经记录(搜索以下术语:Sven Schreiber PDB会提供一些线索),用于创建它们的库与DbgHelp库不同,后者只能用于读取/解析已创建的调试符号。它们是Visual Studio产品的一部分,通常被命名为mspdbXY.dll(其中XY是十进制数字)。

    因此,如果您想创建错误报告,我强烈建议您不要专注于“编译器问题”,而应专注于调试器问题。以下是您可以采取的一般方向:

    1. 使用了解您特定调试格式(例如,在MinGW中使用DWARF的GDB)的调试器
    2. 使用了解多种格式的调试器(例如IDA,还具有其他优点)
    3. 编写扩展程序,以便理解您的调试符号(DWARF)或更通用地.map文件(我知道几年前为Borland .map文件编写了这样的扩展程序)
    4. 学习汇编语言并使用可用工具(WinDbg或更普遍的DbgHelp库)没有符号(除非您已经知道它,否则可能是一个太陡峭的学习曲线)

    作为对4的扩展,您还可以在编译过程中让GCC创建.S(汇编)文件,以便在没有符号支持的情况下交叉参考源代码和崩溃转储。

    鉴于我更喜欢在类Unix平台上使用GDB,在Windows上使用WinDbg和其他调试器,我无法确定GDB在Windows上是否支持实际的崩溃转储格式(使用MiniDumpWriteDump创建),所以我不确定在这种情况下GDB可能期望的格式是什么。

    顺便说一句:如果您使用的是Windows XP或更高版本,并且可以依赖于这个事实,那么请使用AddVectoredExceptionHandler而不是SetUnhandledExceptionFilter来准备写入崩溃转储。


    感谢您详细的回答。使用您提到的函数确实很容易设置崩溃报告。而且,正如预期的那样,GDB无法识别使用MiniDumpWriteDump创建的转储文件。调试格式似乎是主要问题,因为其他遇到同样问题的人没有找到令人满意的答案。现在,至少我可以获取堆栈跟踪(有点,因为并非所有函数名称都显示出来 - 感兴趣的人,请参见我的问题中的链接),并优雅地结束应用程序。 - Jong Bor Lee

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接