自动创建 Visual C++ 故障转储

问题描述 投票:0回答:3

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

visual-studio visual-c++ crash
3个回答
4
投票

更新: 调试诊断 2.0 现已推出。此版本具有对 .NET 转储的本机支持。

是的,可以使用 DebugDiag 1.2

调试诊断工具 (DebugDiag) 旨在协助 解决挂起、性能低下、内存泄漏等问题 或碎片,并在任何用户模式进程中崩溃。工具 包括专注于互联网信息的附加调试脚本 服务 (IIS) 应用程序、Web 数据访问组件、COM+ 和 相关的微软技术。

它甚至允许您对转储运行崩溃/挂起分析,并为您提供有关处于睡眠状态的调用堆栈和线程的良好报告(对于挂起转储)。它还可以让你也处理蝇垃圾场。可以在 DebugDiag、Visual Studio 和 WinDbg 中分析 DebugDiag 获取的转储。

编辑: 有关如何使用 DebugDiag 的 MSDN 链接位于 here


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

© www.soinside.com 2019 - 2024. All rights reserved.