有没有一种方法可以在应用程序崩溃时自动创建一个崩溃转储文件(在Windows操作系统上),就像我可以用Visual Studio调试器保存一样?也就是说,我希望能够在Visual Studio中使用自动创建的崩溃转储文件调试应用程序。
ctehm74n1#
更新:Debug Diag 2.x现已可用。此版本原生支持.NET转储。
可以使用DebugDiag 1.2。故障诊断工具(BLOG Diag)旨在帮助解决挂起、性能降低、内存泄漏或碎片以及任何用户模式进程中的崩溃等问题。该工具包括其他调试脚本,重点是Internet信息服务(IIS)应用程序,Web数据访问组件,COM+和相关的Microsoft技术。它甚至允许您在转储上运行崩溃/挂起分析,并给予一个关于处于睡眠状态的调用堆栈和线程的报告(对于挂起转储)。它也可以让你采取对苍蝇转储太多。可以在VisualStudio、WinDbg和VisualDiag中分析由VisualDiag获取的转储。
**编辑:**如何使用Mylog Diag的MSDN链接是here。
xkftehaa2#
使用SetUnhandledExceptionFilter捕获异常。在这个全局异常处理程序中,使用MiniDumpWriteDump函数创建一个转储文件。这种方式有很多关于异常处理的问题,比如你不能捕获所有的异常(STL异常,纯虚函数,abort C运行时调用等)。此外,如果多个线程导致某个异常,则可能会出现问题。在全局异常处理程序中遇到异常时,您需要挂起所有其他正在运行的线程,或者使用某些逻辑,以便其他线程不会干扰转储生成代码。要处理所有情况,您需要调整链接器设置(如/EHsc标志),以便所有异常都可以由try-catch处理,甚至为发布版本启用调试信息,以便生成.PDB并可以获取调用堆栈。使用API挂钩,这样C运行时调用就不会禁用全局异常处理程序和批!看看这些:
SetUnhandledExceptionFilter
MiniDumpWriteDump
abort
/EHsc
try-catch
我唯一的建议是你从简单的方法开始,不要为更复杂的场景而烦恼。简而言之,只需在单线程应用程序中使用SetUnhandledExceptionFilter,导致访问冲突,并在global-exception-handler中使用MinidumpWriteDump创建MINI转储(即没有内存转储)。
MinidumpWriteDump
brgchamk3#
您可能需要检查WER(Windows Error Reporting)。可以使用注册表项配置它以生成C++应用程序的崩溃转储(不适用于.NET)。注册表项 *:
(as an expandable string) HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\DumpFolder
我将值设置为%LOCALAPPDATA%\CrashDumps。此外,您可以只过滤到您的应用程序或最大化转储的数量,甚至设置转储的类型。
%LOCALAPPDATA%\CrashDumps
WOW6432Node
3条答案
按热度按时间ctehm74n1#
更新:Debug Diag 2.x现已可用。此版本原生支持.NET转储。
可以使用DebugDiag 1.2。
故障诊断工具(BLOG Diag)旨在帮助解决挂起、性能降低、内存泄漏或碎片以及任何用户模式进程中的崩溃等问题。该工具包括其他调试脚本,重点是Internet信息服务(IIS)应用程序,Web数据访问组件,COM+和相关的Microsoft技术。
它甚至允许您在转储上运行崩溃/挂起分析,并给予一个关于处于睡眠状态的调用堆栈和线程的报告(对于挂起转储)。它也可以让你采取对苍蝇转储太多。可以在VisualStudio、WinDbg和VisualDiag中分析由VisualDiag获取的转储。
**编辑:**如何使用Mylog Diag的MSDN链接是here。
xkftehaa2#
使用
SetUnhandledExceptionFilter
捕获异常。在这个全局异常处理程序中,使用MiniDumpWriteDump
函数创建一个转储文件。这种方式有很多关于异常处理的问题,比如你不能捕获所有的异常(STL异常,纯虚函数,
abort
C运行时调用等)。此外,如果多个线程导致某个异常,则可能会出现问题。在全局异常处理程序中遇到异常时,您需要挂起所有其他正在运行的线程,或者使用某些逻辑,以便其他线程不会干扰转储生成代码。要处理所有情况,您需要调整链接器设置(如
/EHsc
标志),以便所有异常都可以由try-catch
处理,甚至为发布版本启用调试信息,以便生成.PDB并可以获取调用堆栈。使用API挂钩,这样C运行时调用就不会禁用全局异常处理程序和批!看看这些:
我唯一的建议是你从简单的方法开始,不要为更复杂的场景而烦恼。简而言之,只需在单线程应用程序中使用
SetUnhandledExceptionFilter
,导致访问冲突,并在global-exception-handler中使用MinidumpWriteDump
创建MINI转储(即没有内存转储)。brgchamk3#
您可能需要检查WER(Windows Error Reporting)。
可以使用注册表项配置它以生成C++应用程序的崩溃转储(不适用于.NET)。
注册表项 *:
我将值设置为
%LOCALAPPDATA%\CrashDumps
。此外,您可以只过滤到您的应用程序或最大化转储的数量,甚至设置转储的类型。
WOW6432Node
。