【问题标题】:DebugDiag dump doesn't include a .NET exception, depending on certain codeDebugDiag 转储不包含 .NET 异常,具体取决于某些代码
【发布时间】:2021-01-26 14:30:20
【问题描述】:

我正在尝试使用 DebugDiag 创建一个转储,其中将包含有关未处理的 .NET 异常的信息。

转储文件的创建似乎依赖于运行代码,我不明白为什么。

这些是我采取的步骤:

  1. 使用以下代码准备一个名为 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;
            }
        }
    }
    
  2. 编译并使用DebugDiagTest.exe true运行,此时不要按任何键;让它等待按键(第 4 步)。

  3. 准备一个DebugDiag异常规则(可以关注this article)。

  4. 回到正在运行的DebugDiagTest.exe,然后按某个键使其崩溃。

  5. 转到C:\Program Files\DebugDiag\Logs\Crash rule for all instances of DebugDiagTest.exe你会看到一个.dmp 文件

  6. 现在使用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

标签: c# debugging debugdiag


【解决方案1】:

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

这将让您大致了解它的强大程度。

【讨论】:

  • 谢谢,我会奖励赏金的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-12-22
  • 1970-01-01
  • 1970-01-01
  • 2021-12-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多