1

我正在尝试使用 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异常规则(可以按照这篇文章)。

  4. 回到 running 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

1 回答 1

2

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

这将为您提供一个概述,它是多么强大。

于 2021-01-28T19:03:19.653 回答