知識マップ: WinDbg + SOSでクラッシュダンプを読む ── 収集した後の実務解析入門
記事「WinDbg + SOSでクラッシュダンプを読む ── 収集した後の実務解析入門」の主張を、概念と関係(エッジ)に分解した知識グラフの全体です。各関係には根拠・確認日・確度が付いています。
この記事はクラッシュダンプをWinDbgで解析する手順を扱い、WinDbgはSOS拡張を読み込むことで初めて.NETのマネージドヒープや例外情報を読めるようになります。未処理例外の調査は!clrstackでスタックを、!peで例外オブジェクトを確認する流れになり、メモリが増え続ける調査は!dumpheap -statでヒープの統計を取ってから!gcrootで参照元をたどります。ネイティブクラッシュには!analyze -vによる自動解析を用い、PDBが無くても多くのコマンドは機能しますがソースファイル名・行番号だけは失われます。純粋なマネージドコードの調査なら、WinDbgより軽量なdotnet-dump analyzeも選択肢になりますが、ネイティブスタックフレームは扱えません。
flowchart LR
accTitle: WinDbg+SOSによるクラッシュダンプ解析の知識マップ
accDescr: クラッシュダンプをWinDbgとSOS拡張で読み解く際に、対象が未処理例外かマネージドメモリリークかネイティブクラッシュかに応じてどのコマンドを使うか、シンボル(PDB)の有無で何が変わるか、dotnet-dumpとの使い分けを示した図。
crash_dump["クラッシュダンプ"]
windbg["WinDbg"]
sos_extension["SOS拡張"]
pdb["PDB(プログラムデータベース)"]
unhandled_exception["未処理例外"]
clrstack_command["!clrstack(CLRStackコマンド)"]
printexception_command["!pe(PrintExceptionコマンド)"]
managed_memory_leak["マネージドメモリリーク"]
dumpheap_command["dumpheap -statコマンド"]
gcroot_command["gcrootコマンド"]
managed_heap["マネージドヒープ"]
native_crash["ネイティブクラッシュ"]
analyze_v_command["!analyze -v"]
dotnet_dump["dotnet-dump"]
dotnet_framework[".NET Framework"]
dotnet[".NET(Core以降)"]
handle_leak["ハンドルリーク"]
windbg -.->|"利用する"| sos_extension
windbg -->|"利用する"| crash_dump
windbg -.->|"前提とする"| pdb
unhandled_exception -.->|"で確認できる"| clrstack_command
unhandled_exception -.->|"で確認できる"| printexception_command
managed_memory_leak -->|"で確認できる"| dumpheap_command
managed_memory_leak -->|"で確認できる"| gcroot_command
dumpheap_command -->|"利用する"| managed_heap
gcroot_command -->|"利用する"| managed_heap
native_crash -->|"で確認できる"| analyze_v_command
dotnet_dump -->|"前提とする"| crash_dump
dotnet_dump -->|"利用する"| sos_extension
dotnet_dump -->|"用いるのは非推奨"| native_crash
windbg -->|"推奨される対応"| native_crash
dotnet_dump -->|"推奨される対応"| managed_memory_leak
sos_extension -.->|"前提とする"| dotnet_framework
sos_extension -.->|"前提とする"| dotnet
handle_leak -.->|"で確認できる"| gcroot_command
unhandled_exception -.->|"原因になり得る"| crash_dump
概念間の関係(全19件)
図と同じ関係を文章でも列挙します。表示している文と機械可読な意味データ(RDFa)は同じ要素に載っています。確度が「確立した関係」のものは直接の関係として、「条件付きの関係」のものは成立条件つきの言明(rdf:Statement)として表現しています。
- WinDbgはSOS拡張を利用します。
- WinDbgはクラッシュダンプを利用します。
- WinDbgはPDB(プログラムデータベース)を前提とします。
- 未処理例外は!clrstack(CLRStackコマンド)で確認できます。
- 未処理例外は!pe(PrintExceptionコマンド)で確認できます。
- マネージドメモリリークはdumpheap -statコマンドで確認できます。
- マネージドメモリリークはgcrootコマンドで確認できます。
- dumpheap -statコマンドはマネージドヒープを利用します。
- gcrootコマンドはマネージドヒープを利用します。
- ネイティブクラッシュは!analyze -vで確認できます。
- dotnet-dumpはクラッシュダンプを前提とします。
- dotnet-dumpはSOS拡張を利用します。
- dotnet-dumpをネイティブクラッシュに用いることは推奨されません。
- WinDbgはネイティブクラッシュに対する本記事の推奨です。
- dotnet-dumpはマネージドメモリリークに対する本記事の推奨です。
- SOS拡張は.NET Frameworkを前提とします。
- SOS拡張は.NET(Core以降)を前提とします。
- ハンドルリークはgcrootコマンドで確認できます。
- 未処理例外はクラッシュダンプの原因になることがあります。
主要概念の定義
機械可読データ
このページはサイトの知識グラフ(_data/knowledge/)から自動生成されています。誤りの指摘はお問い合わせからお願いします。