.NET 診断アナライザーを使用してマネージド メモリ ダンプをデバッグする

このチュートリアルでは、次のことを行います。

  • メモリ ダンプを開く
  • ダンプに対するアナライザーを選択して実行する
  • アナライザーの結果を確認する
  • 問題のあるコードに移動する

この記事で説明されている例では、アプリが要求にタイムリーに応答していないことを問題にしています。

Visual Studio でメモリ ダンプを開く

  1. [ファイル] > [開く] > [ファイル] メニュー コマンドを使用して Visual Studio でメモリ ダンプを開き、メモリ ダンプを選びます。

  2. [メモリ ダンプの概要] ページにある [診断分析の実行] という名前の新しいアクションに注目します。

    Action - Diagnostics Analysis

  3. このアクションを選択してデバッガーを起動し、新しい [診断分析] ページを開きます。ここには、使用可能なアナライザー オプションの一覧が、基になる現象ごとに整理して表示されます。

ダンプに対するアナライザーを選択して実行する

これらの現象を調査するには、この例にある問題に最も適した [プロセスの応答性] で最適なオプションを使用できます。

Select diagnostics analyzers

  1. [分析] ボタンをクリックして、調査プロセスを開始します。

  2. アナライザーには、メモリ ダンプでキャプチャされたプロセス情報と CLR データの組み合わせに基づいて結果が表示されます。

アナライザーの結果を確認する

  1. この場合は、アナライザーによって 2 つのエラーが検出されました。 アナライザーの結果を選択すると、[分析の概要] と推奨される [修復] が表示されます。

    Diagnostics analyzers results

  2. [分析の概要] には、"CLR スレッド プールで枯渇が発生している" ことが示されています。 この情報は、CLR で使用可能なすべてのスレッド プールのスレッドが使用されるようになっているため、スレッドが解放されるまで、サービスがどの新しい要求にも応答できないことを示唆しています。

    Note

    この場合の [修復] は次のとおりです。"スレッドをブロックする可能性があるモニター、イベント、タスク、またはその他のオブジェクトを同期的に待機しないでください。 このメソッドを非同期になるように更新できるかどうかを確認してください。"

次の仕事は、その問題のあるコードを見つけることです。

  1. [呼び出し履歴を表示] リンクをクリックすると、Visual Studio は直ちに、この動作を示しているスレッドに切り替わります。

  2. [呼び出し履歴] ウィンドウには、自分のコード (SyncOverAsyncExmple.) とフレームワークのコード (System.) をすばやく区別する可能性のあるメソッドが表示されます。

    Diagnostics analyzers link to call stack

  3. 呼び出し履歴の各フレームはメソッドに対応し、スタック フレームをダブルクリックすると、Visual Studio は、このスレッド上のこのシナリオに直接つながったコードに移動します。

  4. この例にはシンボルやコードが存在しませんが、[読み込まれていないシンボル] ページで、[ソース コードを逆コンパイルする] オプションを選択できます。

    Decompilation

  5. 下の逆コンパイルされたソースでは、非同期タスク (ConsumeThreadPoolThread) が、ブロックしている同期関数を呼び出していることが明らかです。

    Note

    WaitHandle.WaitOne メソッドを含む "DoSomething()" メソッドが、シグナルを受信するまで現在のスレッド プールのスレッドをブロックしています。

    アプリの応答性を向上させるには、ブロックしている同期コードをすべての非同期コンテキストから削除することが重要です。

    Analyze decompiled code