24

我有一个用 MinGW 编译的 c++ 应用程序,我一直收到客户的崩溃投诉。因此,除了大量记录可能崩溃的部分(在发布新版本之前)之外,我一直在寻找一个崩溃报告器,它可以帮助我在出现错误时找出堆栈跟踪和任何其他有用的调试信息。

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

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

能够将信息写入文件就足以满足我的目的。然后我可以要求我的客户将信息邮寄给我。

我一直在研究google-breakpadSetUnhandledExceptionFilter,但我仍然不知道它们是否有用。其他崩溃报告实用程序,例如crashrpt,是为 Visual C++ 设计的,所以我想用 MinGW 尝试它们并没有多大意义。

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

4

1 回答 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,IIRC)
  2. 使用理解多种格式的调试器(我想到了 IDA 并且还有其他优点;))
  3. 为 WinDbg 之类的东西写一个扩展,以便理解你的调试符号(DWARF)或更通用的.map文件(我知道这样的扩展是几年前为 Borland.map文件编写的)
  4. 学习汇编语言并使用没有符号的可用工具(WinDbg 或更一般的 DbgHelp 库)(除非您已经知道,否则学习曲线可能太陡峭)

作为 4 的扩展,您还可以让 GCC.S在编译期间创建(汇编)文件,以便在没有符号支持的情况下交叉引用源代码和故障转储。

鉴于我更喜欢​​ unixoid 平台上的 GDB,但 Windows 上的 WinDbg 和其他调试器,我不能真正说是否支持MiniDumpWriteDumpWindows 上的 GDB 中的实际故障转储格式(使用创建),所以我不确定可能是什么格式在这种情况下是 GDB 所期望的。

顺便说一句:如果您使用 Windows XP 或更高版本并且可以依赖该事实,请使用AddVectoredExceptionHandler而不是SetUnhandledExceptionFilter准备编写故障转储。

于 2011-03-08T02:17:31.230 回答