实际上,问题不在于让崩溃报告起作用。这对于 DbgHelp 库函数来说是相当微不足道的,并且在那里最为突出MiniDumpWriteDump
。但是请记住,要在旧系统上重新分发 DbgHelp 库,并遵守您打算调用的函数的版本要求 - 较新版本的 Windows 至少带有该库的某个版本。
您使用非 MS 编译器的问题(问题也存在于 Embarcadero,以前的 Borland,产品,例如,或 Watcom)是创建的调试符号对 DbgHelp 库没有意义 - 这是用于调试的标准工具在 Windows 上。PDB 格式在很大程度上没有记录(对于一些线索搜索术语:Sven Schreiber PDB)并且用于创建它们的库在与 DbgHelp 库相同的意义上不是“公共的” - 后者只能用于读取/解析创建的调试符号。它们是 Visual Studio 产品的一部分,通常命名为 mspdbXY.dll(其中 XY 是十进制数字)。
所以,如果你想创建错误报告,我强烈建议不要专注于“编译器问题”,而是专注于调试器问题。以下是您可以前往的一般方向:
- 使用了解您的特定调试格式的调试器(MinGW 中的 DWARF 的 GDB,IIRC)
- 使用理解多种格式的调试器(我想到了 IDA 并且还有其他优点;))
- 为 WinDbg 之类的东西写一个扩展,以便理解你的调试符号(DWARF)或更通用的
.map
文件(我知道这样的扩展是几年前为 Borland.map
文件编写的)
- 学习汇编语言并使用没有符号的可用工具(WinDbg 或更一般的 DbgHelp 库)(除非您已经知道,否则学习曲线可能太陡峭)
作为 4 的扩展,您还可以让 GCC.S
在编译期间创建(汇编)文件,以便在没有符号支持的情况下交叉引用源代码和故障转储。
鉴于我更喜欢 unixoid 平台上的 GDB,但 Windows 上的 WinDbg 和其他调试器,我不能真正说是否支持MiniDumpWriteDump
Windows 上的 GDB 中的实际故障转储格式(使用创建),所以我不确定可能是什么格式在这种情况下是 GDB 所期望的。
顺便说一句:如果您使用 Windows XP 或更高版本并且可以依赖该事实,请使用AddVectoredExceptionHandler
而不是SetUnhandledExceptionFilter
准备编写故障转储。