【发布时间】:2021-01-26 14:30:20
【问题描述】:
我正在尝试使用 DebugDiag 创建一个转储,其中将包含有关未处理的 .NET 异常的信息。
转储文件的创建似乎依赖于运行代码,我不明白为什么。
这些是我采取的步骤:
-
使用以下代码准备一个名为
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,并查看每次都创建了一个转储文件。但是,重新运行 DebugDiagTest.exe false 永远不会创建转储文件。
我的问题:
为什么运行 DebugDiagTest.exe true 会创建转储,而 DebugDiagTest.exe false 不会?
【问题讨论】:
-
崩溃规则仅有效一次,因为在第 4 步中该进程终止。按设计。
-
@LexLi,这不是真的。每次运行
DebugDiagTest.exe true时都会创建一个转储文件,而运行DebugDiagTest.exe false则从不创建转储文件。 -
DebugDiag 需要附加到您新启动的进程,这需要时间。因此,当您的进程崩溃太快时,不会转储。为什么不配置 WER 来创建任何进程的转储? docs.microsoft.com/en-us/windows/win32/wer/…
-
@AloisKraus,我刚刚试用了 WER,它确实有效,谢谢。一般来说,我对转储创建方法不太熟悉,只使用了 DebugDiag,因为它看起来非常可配置,允许指定特定的异常。
-
最好的工具仍然是 procdump,它允许您附加到现有进程或从 procdump 启动您的进程,或者它一直等到它附加到特定进程。 docs.microsoft.com/en-us/sysinternals/downloads/procdump