Skip to content

MS_CrashDump

nishi_74322014 edited this page Aug 3, 2026 · 1 revision

クラッシュ・ダンプ

概要

  • クラッシュ時にプロセスに事後分析デバッガをアタッチしてダンプを取得する。
  • 問題が起きた時刻に近い情報(メモリ&スタック)を取得可能であるが、
    上記に問題の情報が含まれないケースや、マルチスレッド環境下などで、
    重要な情報をタイミングによって取り逃がしているケースはあり得る。
  • クラッシュしたスレッドのスタックを見ることで、
    クラッシュを起こしているプログラムコードの部位の特定が比較的容易。

使用可能なツール

OSや対象プロセス(マネージド、アンマネージド)によって
使用するツール・手順・設定等が異なるのでサポートと連携して行う。

以下は、クラッシュ・ダンプの専用ツール。
ハング・ダンプと併用可能なツールはダンプ取得に使用するツールの一覧を参照。

OS標準

  • 以下のツールを使用できる。
  • ただし、マネージド・プロセスのクラッシュ・ダンプは取得不可。
    この場合は、ADPlus(か、cdb.exe単独実行)を利用する。

ワトソン博士、ワトソンログ

  • Windows OS標準のデバッガでクラッシュ・ダンプ・ファイルを生成できる。
  • ファイル名を指定して実行:「drwtsn32」でワトソン博士の設定画面が開く。
  • ただし、Vista以降のOSでは使用できない。

補足(最新化): ワトソン博士(Dr. Watson)の後継が WER(Windows Error Reporting) で、Vista 以降はこちらが標準。 現在は前述の LocalDumps レジストリ設定でダンプを自動保存するのが最も簡単。

WER(Windows Error Report)

WER(Windows Error Report)

その他

マネージド・コードの場合

UMPD、WinDbg、CDB、NTSD のオプション指定により
CLRの例外発生時のマネージコードのクラッシュダンプ取得も可能。

※ 現在の .NET(Core 以降)では、環境変数 DOTNET_DbgEnableMiniDump=1 / DOTNET_DbgMiniDumpType を設定するだけで、
未処理例外時にランタイムがダンプを出力できる(クロスプラットフォーム)。

取得方法

未処理例外のディスパッチ

未処理例外 = セカンドチャンス(ラストチャンス)例外

  • 通常は無害な(ハンドリングされた)ファーストチャンス例外は無視して継続する。
  • セカンドチャンス(ラストチャンス)例外の通知により、
    事後分析デバッガ(ダンプツール)をアタッチしてダンプを出力する。

ファーストチャンス例外

無害な(ハンドリングされた)例外

※ 正確には「デバッガに最初に通知された時点」の例外を指す。
アプリの catch で処理されればそこで終わり(セカンドチャンスにならない)。

ダンプ取得できないマネージ例外

  • .NETのランタイム(mscorwks.dll 内部)でAccess Violation等の例外が発生した場合、
    .NETでは、ユーザアプリケーションでは例外をハンドルできない仕様となっている。
  • この場合、ファーストチャンス例外発生後に、イベントログを出力しプロセスを終了するので、
    セカンドチャンス例外が発生せず、クラッシュダンプをデバッガから取得できない。
  • このため、このようなケースではファーストチャンス例外の監視機能を持つ
    UMPDやADPlusなどのダンプ取得ツールを使用してクラッシュダンプを取得する。

移行メモ(誤記): 原文の mccorwks.dllmscorwks.dll の誤記 (.NET Framework 2.0〜3.5 の CLR 本体。4.0 以降は clr.dll、 .NET Core 以降は coreclr.dll)。

事後分析デバッガのインストール方法と設定方法

デフォルトのデバッガのレジストリ登録位置は以下。

  • アンマネージド、.NET Framework 4 以降
    • キー:HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug
      (32bit 用は \Wow6432Node\...WOW64 を参照)
    • エントリ
      • Auto 値:1
      • Debugger 値:ツール・動作により可変(下記参照)
  • .NET Framework 2 - 3.x
    • キー:HKLM\Software\Microsoft\.NETFramework\(32bit 用は \Wow6432Node\...
    • エントリ
      • DbgJITDebugLaunchSetting 値:2 or 16
      • DbgManagedDebugger 値:ツール・動作により可変(下記参照)

ワトソン博士

  • インストール方法:drwtsn32 -i
  • Debugger値
    • デバッグ:-(ダンプ専用)
    • ダンプ:drwtsn32 -p %ld -e %ld -g

WinDbg

  • インストール方法:WinDbg -I
  • Debugger値
    • デバッグ時:windbg.exe -p %ld -e %ld -g
    • ダンプ時:windbg.exe -p %ld -e %ld -g -c '.dump /o /ma /u 出力先パス\new.dmp; q' -Q -QS -QY -QSY

CDB

  • インストール方法:cdb -iae
  • Debugger値
    • デバッグ時:cdb.exe -p %ld -e %ld -g
    • ダンプ時:cdb.exe -p %ld -e %ld -g -c ".dump /o /ma /u 出力先パス\new.dmp; q"

NTSD

  • インストール方法:ntsd -iae
  • Debugger値
    • デバッグ時:ntsd.exe -p %ld -e %ld -g
    • ダンプ時:ntsd.exe -p %ld -e %ld -g -c ".dump /o /ma /u 出力先パス\new.dmp; q"

Visual Studio 2010 以降

  • Debugger値(デバッグ時):vsjitdebugger.exe -p %ld -e %ld

その他の設定

  • Windows Forms(MS_WindowsForms.md
<configuration>
  <system.windows.forms jitDebugging="true" />
</configuration>
  • WER の設定(必要に応じて行う)
    • キー:HKLM\Software\Microsoft\Windows\Windows Error Reporting
      (32bit 用は \WOW6432Node\...
    • エントリ Disabled:既定なし → 1(無効の意)

移行メモ(誤記): 原文の「WRE の設定」は WER(Windows Error Reporting)の誤記。

その他の取得方法

UnhandledExceptionFilter関数

プログラムはクラッシュさせずに自前の未処理例外フィルタを実行することもできる。
また、ここでセルフダンプの取得を行う事もできる。

メモリリーク用

グローバルフラグ

また、グローバルフラグを設定して

  • ヒープリーク検出機能(ページ ヒープ)
    !heap -p -a コマンドで stacktrace を出力可能にする(必須)。
  • ユーザモード スタックトレース データベース
    !heap -a コマンドで stacktrace を出力可能にする(オプション)、UMDH 用(必須)

を有効にする必要がある。

ページ ヒープをオンにした場合、ヒープオーバーランの検出も可能になる。
※ ヒープに対するバッファオーバーランをヒープオーバーランと呼ぶ。

ページ ヒープ、ユーザモード スタックトレース データベースはメモリを使用するため、
調査後には無効にする。

Global Flags Editor

グローバルフラグの設定には、Global Flags Editor (gflags.exe) ユーティリティを使用する
(Debugging Tools for Windows に同梱されている)。

  • CUI

    • 有効化:gflags -i <実行ファイル名> +ust +hpa
    • 無効化:gflags -i <実行ファイル名> -ust -hpa
  • GUI
    Image File タブから、対象イメージの

    • enable page heap チェックボックス
    • create user mode stack trace database チェックボックス

    を有効・無効にする。

添付ファイル

参考

プロセッサ例外とその定義

# 例外
00 Divide Fault(除算違反)
02 NMI Interrupt(NMI 割り込み)
04 Overflow Trap(オーバーフロー トラップ)
05 Bounds Check Fault(境界チェック違反)
06 Invalid Opcode Fault(無効なオペコード違反)
07 Coprocessor Not Available Fault(コプロセッサ利用不可違反)
08 Double Fault(ダブル フォールト)
09 Coprocessor Segment Overrun(コプロセッサ セグメント オーバーラン)
10 (0Ah) Invalid Task State Segment Fault(無効なタスク状態セグメント)
11 (0Bh) Not Present Fault(不在違反)
12 (0Ch) Stack Fault(スタック違反)
13 (0Dh) General Protection Fault(一般保護違反)
14 (0Eh) Page Fault(ページ違反)
16 (10h) Coprocessor Error Fault(コプロセッサ エラー)
17 (11h) Alignment Check Fault(アライメント チェック違反)

Tags: 障害対応, 性能, デバッグ

NetDevInfraWiki

マイクロソフト系技術情報 Wiki
Open 棟梁 Wiki

(未着手)

開発基盤部会 Wiki

移行管理: DONETODO

Clone this wiki locally