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

クラッシュダンプ
type: Concept
definition: プロセスのメモリ内容・スタック情報・例外情報などをファイルへ書き出した、クラッシュ調査に使うスナップショットである。
alternative label: .dmpファイル
alternative label: ダンプファイル

WinDbg
type: Concept
definition: クラッシュダンプやハングしたプロセスの状態をカーネル/ユーザーモードで解析するためのMicrosoft製デバッガー。SOS拡張によるマネージドヒープ解析や、Application Verifierの検出結果の解析にも使われる。
alternative label: Debugging Tools for Windows
uses: クラッシュダンプ
recommended for: ネイティブクラッシュ

SOS拡張
type: Concept
definition: マネージドヒープの情報収集、ヒープ破損の検出、ランタイム内部データ型の表示など、CLRの内部をデバッガー上から読むためのデバッガー拡張である。
alternative label: Son of Strike
alternative label: sos.dll
broader: WinDbg

PDB(プログラムデータベース)
type: Concept
definition: ビルド後の.dll/.exeと、ソースコード上の行・変数名を結びつけるデバッグ情報ファイル。アプリケーションの実行には通常不要だが、デバッグ・例外調査・ダンプ解析に使う。
alternative label: Program Database
alternative label: シンボルファイル

未処理例外
type: Concept
definition: アプリケーションのどこでもキャッチされないままランタイムまで届き、プロセスを終了させる例外である。
alternative label: unhandled exception

!clrstack(CLRStackコマンド)
type: Concept
definition: SOS拡張が提供する、マネージドコードだけのスタックトレースを表示するコマンドである。
alternative label: CLRStack
broader: SOS拡張

!pe(PrintExceptionコマンド)
type: Concept
definition: SOS拡張が提供する、現在のスレッドで最後にスローされた例外の型・メッセージ・内部例外・スタックトレースを表示するコマンドである。
alternative label: PrintException
alternative label: !pe -nested
broader: SOS拡張

マネージドメモリリーク
type: Concept
definition: マネージドオブジェクトへの参照が解放されずに残り続け、マネージドヒープの使用量が増え続ける状態である。
alternative label: メモリリーク(.NET)
verified by: dumpheap -statコマンド
verified by: gcrootコマンド

dumpheap -statコマンド
type: Concept
definition: ヒープ上の型ごとの件数(Count)とサイズ(Size)の統計を表示するSOSデバッガーコマンド。
alternative label: !dumpheap -stat
uses: マネージドヒープ

gcrootコマンド
type: Concept
definition: 指定したオブジェクトがどこから参照されているか、GCルートまでの参照経路を表示するSOSデバッガーコマンド。
alternative label: !gcroot
uses: マネージドヒープ

マネージドヒープ
type: Concept
definition: .NETのガベージコレクターが管理する、マネージドオブジェクトが確保されるメモリ領域である。
alternative label: managed heap

ネイティブクラッシュ
type: Concept
definition: C++のDLL、COM、ベンダーSDKなどが絡む、マネージド例外ではなくネイティブコード側で発生するクラッシュである。
alternative label: アクセス違反
alternative label: ネイティブ例外
verified by: !analyze -v

!analyze -v
type: Concept
definition: クラッシュ・例外の自動解析を行うWinDbgの拡張コマンドで、-vオプションを付けると落ちた場所・推定原因・所属モジュールなどを詳細表示する。
alternative label: !analyze -hang
broader: WinDbg

dotnet-dump
type: Concept
definition: プロセスのダンプ(ヒープダンプやクラッシュダンプ)を収集・解析する.NETの診断ツール。SOSコマンド(dumpheap・gcroot・clrstackなど)でヒープの参照元やスタックトレースを調べられるが、ネイティブのスタックフレームは扱えない。
requires: クラッシュダンプ
uses: SOS拡張
not recommended for: ネイティブクラッシュ
recommended for: マネージドメモリリーク

.NET Framework
type: Concept
definition: Windowsのコンポーネントとして扱われ、インストールされているOSのライフサイクルに沿ってサポートされるランタイム。System.Messagingの対象範囲。

.NET(Core以降)
type: Concept
definition: .NET Frameworkの後継となる、クロスプラットフォーム対応の.NETランタイム(.NET 5以降)。
alternative label: .NET Core
alternative label: モダンな.NET

ハンドルリーク
type: Concept
definition: 参照カウントやハンドルカウントの数え違いなどにより、不要になったハンドル(ファイル・イベント・スレッド・GDIオブジェクト・アクセストークンなどカーネルオブジェクトへの参照)が解放されずに積み上がっていく状態。
alternative label: Handle Leak

subject: WinDbg
predicate: uses
object: SOS拡張
description: .NETアプリのダンプでマネージドヒープの中身やC#のスタックフレームを見るには、WinDbg上でSOS拡張を読み込む必要がある
evidence: sos-debugging-extension
verified at: 2026-08-01
certainty: context-dependent

subject: WinDbg
predicate: uses
object: クラッシュダンプ
description: WinDbgは-zオプションまたはFileメニューからクラッシュダンプファイルを指定して開き、その中身を解析する
evidence: opening-a-crash-dump-file-using-windbg
verified at: 2026-08-01
certainty: established

subject: WinDbg
predicate: requires
object: PDB(プログラムデータベース)
description: ソースファイル名・行番号やネイティブフレームの関数名まで見るには、_NT_SYMBOL_PATHにPDBの場所を通す必要があるが、多くのコマンドはPDBが無くても機能する
evidence: symbol-path
verified at: 2026-08-01
certainty: context-dependent

subject: 未処理例外
predicate: verifiedBy
object: !clrstack(CLRStackコマンド)
description: マネージドコードの未処理例外で落ちたダンプは、例外を持つスレッドに切り替えて!clrstackでマネージドスタックを表示することで、どの経路で落ちる場所まで来たかを確認できる
evidence: commands
verified at: 2026-08-01
certainty: context-dependent

subject: 未処理例外
predicate: verifiedBy
object: !pe(PrintExceptionコマンド)
description: マネージドコードの未処理例外では、!pe(PrintException)で例外オブジェクトの型・メッセージ・内部例外を確認できる
evidence: commands
verified at: 2026-08-01
certainty: context-dependent

subject: マネージドメモリリーク
predicate: verifiedBy
object: dumpheap -statコマンド
description: !dumpheap -statでマネージドヒープの型ごとの件数・合計サイズを確認し、量で殴っている型を特定する
evidence: debug-memory-leak
verified at: 2026-08-01
certainty: established

subject: マネージドメモリリーク
predicate: verifiedBy
object: gcrootコマンド
description: !dumpheapで特定した個別インスタンスについて!gcrootを実行し、GCで回収されずに残り続ける原因の参照元を洗い出す
evidence: debug-memory-leak
verified at: 2026-08-01
certainty: established

subject: dumpheap -statコマンド
predicate: uses
object: マネージドヒープ
description: !dumpheapはマネージドヒープを走査して型ごとの統計または個別インスタンスの一覧を表示する
evidence: debug-memory-leak
verified at: 2026-08-01
certainty: established

subject: gcrootコマンド
predicate: uses
object: マネージドヒープ
description: !gcrootはマネージドヒープとハンドルテーブルの全体を検索して参照経路を洗い出す
evidence: debug-memory-leak
verified at: 2026-08-01
certainty: established

subject: ネイティブクラッシュ
predicate: verifiedBy
object: !analyze -v
description: アクセス違反などのネイティブクラッシュは、まず!analyze -vの自動解析でFAULTING_IPやFOLLOWUP_IPなどの主要フィールドを確認するところから入る
evidence: using-the--analyze-extension
verified at: 2026-08-01
certainty: established

subject: dotnet-dump
predicate: requires
object: クラッシュダンプ
description: dotnet-dump analyzeはクラッシュダンプファイルを指定して対話セッションを開く
evidence: dotnet-dump
verified at: 2026-08-01
certainty: established

subject: dotnet-dump
predicate: uses
object: SOS拡張
description: dotnet-dump analyzeはSOSが事前インストールされた対話セッションを開き、clrstackやdumpheapなどSOSのコマンド体系をそのまま使える
evidence: dotnet-dump
verified at: 2026-08-01
certainty: established

subject: dotnet-dump
predicate: notRecommendedFor
object: ネイティブクラッシュ
description: dotnet-dumpはネイティブなデバッガーではないためネイティブのスタックフレームを扱えず!analyze -vも使えないので、ネイティブクラッシュの調査には向かない
evidence: dotnet-dump
verified at: 2026-08-01
certainty: established

subject: WinDbg
predicate: recommendedFor
object: ネイティブクラッシュ
description: COMやP/Invoke、ネイティブDLLが絡む可能性がある調査には、ネイティブスタックフレームと!analyze -vが使えるWinDbgが本記事の推奨である
evidence: dotnet-dump
verified at: 2026-08-01
certainty: established

subject: dotnet-dump
predicate: recommendedFor
object: マネージドメモリリーク
description: 純粋なマネージドコードのメモリリーク調査で、CIや複数プラットフォームでも動かしたい場合は、導入が軽いdotnet-dump analyzeが本記事の推奨である
evidence: dotnet-dump
verified at: 2026-08-01
certainty: established

subject: SOS拡張
predicate: requires
object: .NET Framework
description: 対象アプリが.NET Frameworkの場合、ランタイム本体clr.dllの近傍から.loadby sos clrでSOSを読み込む
evidence: debugging-managed-code
verified at: 2026-08-01
certainty: context-dependent

subject: SOS拡張
predicate: requires
object: .NET(Core以降)
description: 対象アプリが.NET Core/.NET 5+の場合、ランタイム本体coreclr.dllの近傍から.loadby sos coreclrでSOSを読み込む
evidence: debugging-managed-code
verified at: 2026-08-01
certainty: context-dependent

subject: ハンドルリーク
predicate: verifiedBy
object: gcrootコマンド
description: SafeHandleを持つマネージドラッパーが原因のハンドルリークでは、!dumpheap -statでマネージドヒープの増加がないと分かった後、そのラッパーが残っていれば!gcrootでGCルートを追い、OSハンドルの解放漏れ箇所を特定できる
evidence: commands
verified at: 2026-08-01
certainty: context-dependent

subject: 未処理例外
predicate: mayCause
object: クラッシュダンプ
description: 未処理例外はプロセスを終了させ、WER LocalDumpsやProcDumpの設定次第でその瞬間のクラッシュダンプが書き出される
evidence: opening-a-crash-dump-file-using-windbg
verified at: 2026-08-01
certainty: context-dependent