我有一个用 MinGW 编译的 C++ 应用程序,我一直收到客户的崩溃投诉。因此,除了大量记录可能崩溃的部分(在发布新版本之前)之外,我一直在寻找一个崩溃报告器,它可以帮助我在出现错误时找到堆栈跟踪和任何其他有用的调试信息。
是否存在与 MinGW 应用程序兼容的此类工具?(似乎编译器和崩溃报告策略之间有密切的关系,因此是问题所在)。
有任何 Windows 工具可以帮助我吗?该应用程序主要在 Windows XP 计算机上运行。
能够将信息写入文件足以满足我的目的。然后我可以要求我的客户将信息邮寄给我。
我一直在调查谷歌断点器 http://code.google.com/p/google-breakpad/ and 设置未处理异常过滤器 http://msdn.microsoft.com/en-us/library/ms680634%28VS.85%29.aspx,但我仍然不知道它们是否会有任何用处。其他崩溃报告实用程序,例如crashrpt http://code.google.com/p/crashrpt/,是为 Visual C++ 设计的,所以我想用 MinGW 尝试它们没有多大意义。
编辑:关于该主题的一些有用的链接
- 解决随机崩溃问题 https://stackoverflow.com/questions/3437809/solving-random-crashes
- DrMinGW(即时调试器) http://code.google.com/p/jrfonseca/wiki/DrMingw
- 我用来获取堆栈跟踪的一些代码 http://www.gamedev.net/topic/457984-walking-the-stack-in-c-with-mingw32/
- Some people with the same problem:
- mingw 下的核心转储 http://mingw-users.1079350.n2.nabble.com/Core-dumping-under-mingw-td2943483.html
- 在 Mingw32 上创建并读取 gdb 核心转储 http://www.mail-archive.com/gdb@gnu.org/msg00073.html
- 使用 MinGW + GDB 进行事后调试 http://old.nabble.com/postmortem-debugging-with-MinGW-%2B-GDB-td28163415.html
实际上,问题不在于如何让崩溃报告发挥作用。这对于 DbgHelp 库函数来说是相当微不足道的,最突出的是MiniDumpWriteDump
。但是,请记住,要在旧系统上重新分发 DbgHelp 库,并遵守要调用的函数的版本要求 - 较新版本的 Windows 至少附带了该库的某些版本。
您使用非 MS 编译器的问题(该问题也存在于 Embarcadero,以前的 Borland,产品,例如,或 Watcom)是调试符号创建的 DbgHelp 库没有任何意义 - 这是theWindows 上调试的标准工具。 PDB 格式基本上没有文档记录(有关一些线索,请搜索术语:斯文·施赖伯 PDB)以及用于的库create它们与 DbgHelp 库不同,不是“公共”的 - 后者只能用于读取/解析创建的调试符号。它们是 Visual Studio 产品的一部分,通常命名为 mspdbXY.dll(其中 XY 是十进制数字)。
因此,如果您想创建错误报告,我强烈建议您不要专注于“编译器问题”,而是专注于调试器问题。以下是您可以选择的一般方向:
- 使用了解您的特定调试格式的调试器(MinGW、IIRC 中的 DWARF 的 GDB)
- 使用能够理解多种格式的调试器(我想到了 IDA,它还有其他优点;))
- 编写一个类似于 WinDbg 的扩展,以便理解你的调试符号(DWARF)或更一般的意义
.map
文件(我知道这样的扩展是几年前为 Borland 编写的.map
files)
- 学习汇编语言并使用可用的工具(WinDbg 或更普遍的是 DbgHelp 库)without符号(可能是一个太陡峭的学习曲线,除非你已经知道)
作为 4 的扩展,您还可以让 GCC 创建.S
编译期间的(程序集)文件,以便在没有符号支持的情况下工作时交叉引用源代码和故障转储。
鉴于我更喜欢 unixoid 平台上的 GDB,但 Windows 上的 WinDbg 和其他调试器,我真的不能说是否支持实际的故障转储格式(使用MiniDumpWriteDump
) 在 Windows 上的 GDB 中,所以我不确定在这种情况下 GDB 可能需要什么格式。
顺便说一句:如果您使用 Windows XP 或更高版本并且可以信赖这一事实,请使用AddVectoredExceptionHandler
代替SetUnhandledExceptionFilter
准备写入故障转储。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)