自动创建Visual C++崩溃转储文件

4

有没有办法在应用程序崩溃时自动创建崩溃转储文件(在Windows操作系统上),就像我可以在Visual Studio调试器附加的情况下保存一样?也就是说,我希望能够使用自动生成的崩溃转储文件在Visual Studio中调试我的应用程序。

3个回答

4

更新:Debug Diag 2.0现在已经发布。此版本支持原生的.NET转储。

使用DebugDiag 1.2也是可以实现的。

Debug Diagnostic工具(DebugDiag)旨在帮助您解决各种用户模式进程中出现的问题,例如挂起、性能下降、内存泄漏或碎片化以及崩溃等。该工具还包括专注于Internet信息服务(IIS)应用程序、Web数据访问组件、COM+和相关Microsoft技术的附加调试脚本。

它甚至可以在转储文件上运行崩溃/挂起分析,生成有关处于休眠状态的堆栈和线程的详细报告(针对挂起转储)。它还允许您进行即时转储。 DebugDiag采集的转储文件可在DebugDiag、Visual Studio和WinDbg中进行分析。

编辑:有关如何使用DebugDiag的MSDN链接在此处


有没有示例可以配置它,使其在运行时自动附加到特定进程? - Marc Andreson
@MarcAndreson 只需下载并启动它。整个过程都是向导驱动的。如果您需要使用步骤,请参见此处:http://support.microsoft.com/kb/2580960 - Ganesh R.
谢谢,再补充一点信息:一旦规则设置完成,当进程崩溃时,它将在C:\Program Files\DebugDiag\Logs\Crash rule for process id nnnn.dmp生成一个转储文件。可以从生产服务器下载此转储文件,并在Visual Studio中打开进行调试,只需要设置符号路径位置(pdb文件的路径),这样就可以知道源代码的哪个函数/哪一行。 - gerrytan
所有链接均已失效。 - paulm

3
使用SetUnhandledExceptionFilter来捕获异常。在全局异常处理程序中,使用MiniDumpWriteDump函数创建转储文件。
这种异常处理方式有很多问题,例如您无法捕获所有异常(STL异常、纯虚函数、abort C运行时调用等)。此外,如果多个线程引起某些异常,您可能会遇到问题。当您在全局异常处理程序中收到异常时,您需要挂起所有其他正在运行的线程,或者使用一些逻辑,使其他线程不会干扰您的转储生成代码。
为了处理所有情况,您需要调整链接器设置(如/EHsc标志),以便通过try-catch处理所有异常,即使是在发布版本中也要启用调试信息,以便生成.PDB,并且您可以获取调用堆栈。使用API钩子,以便C运行时调用不会禁用您的全局异常处理程序等等!
请参见以下内容: 我唯一的建议是您从简单的方法开始,并且不要费心更复杂的情况。简而言之,只需在单线程应用程序中使用SetUnhandledExceptionFilter引发访问冲突异常,在全局异常处理程序中使用MinidumpWriteDump创建MINI转储(即无内存转储)。

0
你可能想要检查WER(Windows错误报告)。
可以通过注册表键来配置它,以生成C++应用程序的崩溃转储(对.NET不起作用)。
注册表键*:
(as an expandable string)
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\DumpFolder

我将值设置为%LOCALAPPDATA%\CrashDumps
此外,您可以仅筛选到您的应用程序,或者最大化转储数量,甚至设置转储类型。
* 如果是在64位系统上运行的32位应用程序,您需要在Software和Microsoft之间插入WOW6432Node

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