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