DebugDiag 转储不包含 .NET 异常,具体取决于特定代码
DebugDiag dump doesn't include a .NET exception, depending on certain code
我正在尝试使用 DebugDiag 创建转储,其中将包含未处理的 .NET 异常的信息。
转储文件的创建似乎依赖于 运行ning 代码,我不明白为什么。
这些是我采取的步骤:
使用以下代码准备一个名为 DebugDiagTest
的简单控制台应用程序,它会抛出 InvalidOperationException
异常:
using System;
namespace DebugDiagTest
{
class Program
{
static void Main(string[] args)
{
if (ShouldAwaitKeyPress(args)) Console.ReadLine();
Throw();
}
static void Throw()
{
throw new InvalidOperationException();
}
static bool ShouldAwaitKeyPress(string[] args)
{
var shouldAwaitKeyPress = false;
if (args.Length > 0)
{
bool.TryParse(args[0], out shouldAwaitKeyPress);
}
return shouldAwaitKeyPress;
}
}
}
用DebugDiagTest.exe true
编译和运行,不要按任何键;让它等待按键(第 4 步)。
准备一个DebugDiag异常规则(可以按照this article)。
回到运行宁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
,并且每次都会创建一个转储文件。但是,重新 运行ning DebugDiagTest.exe false
永远不会创建转储文件。
我的问题:
为什么 运行ning DebugDiagTest.exe true
会创建转储,而 DebugDiagTest.exe false
不会?
DebugDiag 需要附加到您的应用程序。如果您在启动过程中崩溃得太快,DebugDiag 将不会附加到您的进程,您也不会从中获得任何转储。
在这种情况下,更容易设置 Windows 错误报告的一些注册表项,以便在您的进程因未处理的异常退出时启用所有或仅您的 exe 进行完整转储。
有关详细信息,请参阅 https://docs.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
这会让您大致了解它的强大程度。
我正在尝试使用 DebugDiag 创建转储,其中将包含未处理的 .NET 异常的信息。
转储文件的创建似乎依赖于 运行ning 代码,我不明白为什么。
这些是我采取的步骤:
使用以下代码准备一个名为
DebugDiagTest
的简单控制台应用程序,它会抛出InvalidOperationException
异常:using System; namespace DebugDiagTest { class Program { static void Main(string[] args) { if (ShouldAwaitKeyPress(args)) Console.ReadLine(); Throw(); } static void Throw() { throw new InvalidOperationException(); } static bool ShouldAwaitKeyPress(string[] args) { var shouldAwaitKeyPress = false; if (args.Length > 0) { bool.TryParse(args[0], out shouldAwaitKeyPress); } return shouldAwaitKeyPress; } } }
用
DebugDiagTest.exe true
编译和运行,不要按任何键;让它等待按键(第 4 步)。准备一个DebugDiag异常规则(可以按照this article)。
回到运行宁
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
,并且每次都会创建一个转储文件。但是,重新 运行ning DebugDiagTest.exe false
永远不会创建转储文件。
我的问题:
为什么 运行ning DebugDiagTest.exe true
会创建转储,而 DebugDiagTest.exe false
不会?
DebugDiag 需要附加到您的应用程序。如果您在启动过程中崩溃得太快,DebugDiag 将不会附加到您的进程,您也不会从中获得任何转储。
在这种情况下,更容易设置 Windows 错误报告的一些注册表项,以便在您的进程因未处理的异常退出时启用所有或仅您的 exe 进行完整转储。 有关详细信息,请参阅 https://docs.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
这会让您大致了解它的强大程度。