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. 実行中の に戻り、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 に答える