有没有办法在应用程序崩溃时(在 Windows 操作系统上)自动创建故障转储文件,就像我可以使用附加的 Visual Studio 调试器进行保存一样?也就是说,我希望能够使用自动创建的故障转储文件在 Visual Studio 中调试我的应用程序。
更新: 调试诊断 2.0 现已推出。此版本具有对 .NET 转储的本机支持。
是的,可以使用 DebugDiag 1.2。
调试诊断工具 (DebugDiag) 旨在协助 解决挂起、性能低下、内存泄漏等问题 或碎片,并在任何用户模式进程中崩溃。工具 包括专注于互联网信息的附加调试脚本 服务 (IIS) 应用程序、Web 数据访问组件、COM+ 和 相关的微软技术。
它甚至允许您对转储运行崩溃/挂起分析,并为您提供有关处于睡眠状态的调用堆栈和线程的良好报告(对于挂起转储)。它还可以让你也处理蝇垃圾场。可以在 DebugDiag、Visual Studio 和 WinDbg 中分析 DebugDiag 获取的转储。
编辑: 有关如何使用 DebugDiag 的 MSDN 链接位于 here。
使用
SetUnhandledExceptionFilter
捕获异常。并在此全局异常处理程序中,使用 MiniDumpWriteDump
函数创建转储文件。
这种方式有很多关于异常处理的问题,就像你无法捕获所有异常(来自 STL、纯虚函数、
abort
C 运行时调用等的异常)。另外,如果多个线程导致某种异常,您可能会遇到问题。当您在全局异常处理程序中遇到异常时,您要么需要挂起所有其他正在运行的线程,要么使用某些逻辑,以便其他线程不会干扰您的转储生成代码。
要处理所有情况,您需要调整链接器设置(如
/EHsc
标志),以便所有异常都可以由 try-catch
处理,甚至为发布版本启用调试信息,以便生成 .PDB 并且您可以获得调用堆栈。使用 API 挂钩,这样 C 运行时调用就不会禁用您的全局异常处理程序等!
请参阅这些:
我唯一的建议是您从更简单的方法开始,不要担心更复杂的场景。简而言之,只需使用
SetUnhandledExceptionFilter
,在单线程应用程序中,导致访问冲突,并在全局异常处理程序中,使用 MinidumpWriteDump
创建 MINI 转储(即没有内存转储)。
您可能需要检查 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
。