知識マップ: WinDbg + SOSでクラッシュダンプを読む ── 収集した後の実務解析入門

記事「WinDbg + SOSでクラッシュダンプを読む ── 収集した後の実務解析入門」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。

この記事はクラッシュダンプをWinDbgで解析する手順を扱い、WinDbgはSOS拡張を読み込むことで初めて.NETのマネージドヒープや例外情報を読めるようになります。未処理例外の調査は!clrstackでスタックを、!peで例外オブジェクトを確認する流れになり、メモリが増え続ける調査は!dumpheap -statでヒープの統計を取ってから!gcrootで参照元をたどります。ネイティブクラッシュには!analyze -vによる自動解析を用い、PDBが無くても多くのコマンドは機能しますがソースファイル名・行番号だけは失われます。純粋なマネージドコードの調査なら、WinDbgより軽量なdotnet-dump analyzeも選択肢になりますが、ネイティブスタックフレームは扱えません。

WinDbg+SOSによるクラッシュダンプ解析の知識マップクラッシュダンプをWinDbgとSOS拡張で読み解く際に、対象が未処理例外かマネージドメモリリークかネイティブクラッシュかに応じてどのコマンドを使うか、シンボル(PDB)の有無で何が変わるか、dotnet-dumpとの使い分けを示した図。利用する利用する前提とするで確認できるで確認できるで確認できるで確認できる利用する利用するで確認できる前提とする利用する用いるのは非推奨推奨される対応推奨される対応前提とする前提とするで確認できる原因になり得るクラッシュダンプWinDbgSOS拡張PDB(プログラムデータベース)未処理例外!clrstack(CLRStackコマンド)!pe(PrintExceptionコマンド)マネージドメモリリークdumpheap -statコマンドgcrootコマンドマネージドヒープネイティブクラッシュ!analyze -vdotnet-dump.NET Framework.NET(Core以降)ハンドルリーク

概念間の関係(全19件)

図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。

主要概念の定義

クラッシュダンプ
プロセスのメモリ内容・スタック情報・例外情報などをファイルへ書き出した、クラッシュ調査に使うスナップショットである。
WinDbg
クラッシュダンプやハングしたプロセスの状態をカーネル/ユーザーモードで解析するためのMicrosoft製デバッガー。SOS拡張によるマネージドヒープ解析や、Application Verifierの検出結果の解析にも使われる。
未処理例外
アプリケーションのどこでもキャッチされないままランタイムまで届き、プロセスを終了させる例外である。
マネージドメモリリーク
マネージドオブジェクトへの参照が解放されずに残り続け、マネージドヒープの使用量が増え続ける状態である。
dumpheap -statコマンド
ヒープ上の型ごとの件数(Count)とサイズ(Size)の統計を表示するSOSデバッガーコマンド。
gcrootコマンド
指定したオブジェクトがどこから参照されているか、GCルートまでの参照経路を表示するSOSデバッガーコマンド。
ネイティブクラッシュ
C++のDLL、COM、ベンダーSDKなどが絡む、マネージド例外ではなくネイティブコード側で発生するクラッシュである。
dotnet-dump
プロセスのダンプ(ヒープダンプやクラッシュダンプ)を収集・解析する.NETの診断ツール。SOSコマンド(dumpheap・gcroot・clrstackなど)でヒープの参照元やスタックトレースを調べられるが、ネイティブのスタックフレームは扱えない。
SOS拡張
マネージドヒープの情報収集、ヒープ破損の検出、ランタイム内部データ型の表示など、CLRの内部をデバッガー上から読むためのデバッガー拡張である。
ハンドルリーク
参照カウントやハンドルカウントの数え違いなどにより、不要になったハンドル(ファイル・イベント・スレッド・GDIオブジェクト・アクセストークンなどカーネルオブジェクトへの参照)が解放されずに積み上がっていく状態。

機械可読データ

このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。