我试图使用DebugDiag创建一个转储,该转储将包含未处理的.NET异常的信息。
转储文件的创建似乎依赖于正在运行的代码,我不明白为什么。
以下是我所采取的步骤:
DebugDiagTest的简单控制台应用程序,该应用程序将引发InvalidOperationException异常:
使用系统;命名空间DebugDiagTest {类程序{静态空洞主(string[] args) { if ( shouldAwaitKeyPress ( args) ) Console.ReadLine();抛出();}静态空抛(){抛出新的InvalidOperationException();}静态bool ShouldAwaitKeyPress(string[] args){ var shouldAwaitKeyPress= false;如果(args.Length > 0) { bool.TryParse(args,out shouldAwaitKeyPress);}返回shouldAwaitKeyPress;}DebugDiagTest.exe true,运行编译和,不要按任何键;让它等待键按下(步骤4)。DebugDiagTest.exe,然后按一些键使它崩溃。C:\Program Files\DebugDiag\Logs\Crash rule for all instances of DebugDiagTest.exe,您将看到一个.dmp文件。DebugDiagTest.exe false,运行再次转到C:\Program Files\DebugDiag\Logs\Crash rule for all instances of DebugDiagTest.exe,您将看到没有创建.dmp文件。现在,您可以任意时间重新运行DebugDiagTest.exe true,并看到每次都会创建一个转储文件。但是,重新运行的DebugDiagTest.exe false从不创建转储文件。
我的问题:
为什么运行DebugDiagTest.exe true会创建转储,而DebugDiagTest.exe false不会创建转储?
发布于 2021-01-28 19:03:19
DebugDiag需要附加到您的应用程序。当您在启动过程中崩溃过快时,DebugDiag还没有连接到您的进程中,您也不会从中得到任何转储。
在这种情况下,更容易设置Windows错误报告的某些注册表项,以使进程在未处理异常情况下退出时,所有或仅为您的exe都能完全转储。有关更多细节,请参见https://learn.microsoft.com/en-us/windows/win32/wer/collecting-user-mode-dumps。
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps
Reg_Expand_SZ DumpFolder e.g. %temp%\WERDumps
DWORD DumpType 2 is full dump
DWORD DumpCount e.g. 10 to keep the last 10 crashed full dumps您还可以创建一个子项。
HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\Windows Error Reporting\LocalDumps\MyApplication.exe 只为您的可执行文件配置转储报告。
如果您想根据特定的异常对转储进行筛选,可以使用SysInternals的procdump,它允许您对例如,每个InvalidOperationException进行一个完整的内存转储。
procdump -ma -e 1 -f InvalidOperationException myApp.exe确保检查扩展的帮助通过
procdump -? -e这将给你一个概述,它有多强大。
https://stackoverflow.com/questions/65903245
复制相似问题