「マイクロソフト系技術情報 Wiki」は、「Open棟梁Project」,「OSSコンソーシアム .NET開発基盤部会」によって運営されています。
目次 †
概要 †
クラッシュ時にプロセスに事後分析デバッガをアタッチしてダンプを取得する。
問題が起きた時刻に近い情報(メモリ&スタック)を取得可能であるが、
上記に問題の情報が含まれないケースや、マルチスレッド環境化などで、
重要な情報をタイミングによって取り逃がしているケースはあり得る。
使用可能なツール †
OSや対象プロセス(マネージド、アンマネージド)によって
使用するツール・手順・設定等が異なるのでサポートと連携して行う。
以下は、クラッシュ・ダンプの専用ツール。
ハング・ダンプと併用可能なツールはこちら。
OS標準 †
- 以下のツールを使用できる。
- ただし、マネージド・プロセスのクラッシュ・ダンプは取得不可。
この場合は、ADPlus(か、cdb.exe単独実行)を利用する。
ワトソン博士、ワトソンログ †
- Windows OS標準のデバッガでクラッシュ・ダンプ・ファイルを生成できる。
- ファイル名を指定して実行:「drwtsn32」でワトソン博士の設定画面が開く。
WER(Windows Error Report) †
ワトソン博士の後継で、Vista以降のOS、クラッシュダンプ以外も取得可能。
- ダンプ取得設定
以下のレジストリ設定で、アンマネージド・プロセスのダンプ取得が可能になる。
- キー:HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps?
- エントリ値
- DampFolder?(REG_EXPAND_SZ)
ダンプファイルが保存されるパス
- DampCount?(REG_DWORD)
ダンプファイルが保存される世代数
- DampType?(REG_DWORD)
ダンプタイプ(0:カスタムダンプ、1:ミニダンプ、2:フルダンプ)
WERのミニダンプ、フルダンプに正確な定義が無いのでカスタムダンプを推奨。
- CustomDampFlags?(REG_DWORD)
カスタムダンプオプション(MINIDUMP_TYPE enumerationの表を参照)
- また、WERのAPIを使用したセルフダンプも可能。
- ダンプファイル名
なお、WERで取得したダンプファイル名は、
- Vista、2008では:「問題のレポートと解決策」
- 7、2008R2では:「信頼性モニター」
にレポートとして表示される。
その他 †
CDB †
NTSD †
マネージド・コードの場合 †
UMPD、WinDbg、CDB、NTSDのオプション指定により
CLRの例外発生時のマネージコードのクラッシュダンプ取得も可能。
参考 †
取得方法 †
未処理例外のディスパッチ †
未処理例外=セカンドチャンス(ラストチャンス)例外
- 通常は無害な(ハンドリングされた)ファーストチャンス例外は無視して継続する。
- セカンドチャンス(ラストチャンス)例外の通知により、事後分析デバッガ(ダンプツール)をアタッチしてダンプを出力する。
ファーストチャンス例外 †
無害な(ハンドリングされた例外
ダンプ取得できないマネージ例外 †
.NETのランタイム(mccorwks.dll内部)でAccess Violation等の例外が発生した場合、.NETでは、ユーザアプリケーションでは例外をハンドルできない仕様となっている。この場合、ファーストチャンス例外発生後に、イベントログを出力しプロセスを終了するので、セカンドチャンス例外が発生せず、クラッシュダンプをデバッガから取得できない。このため、このようなケースではファーストチャンス例外の監視機能を持つUMPDやADPlusなどのダンプ取得ツールを使用してクラッシュダンプを取得する。
事後分析デバッガのインストール方法と設定方法 †
- デフォルトのデハッガのレジストリ登録位置は以下。
※ マネージドプロセスのダンプは対象外
- キー:HKEY_LOCAL_MACHINE\Software\Microsoft\Windows NT\CurrentVersion?\AeDebug?
- エントリ
- Auto値:1
- Debugger値:ツール・動作により可変(下記参照)
ワトソン博士 †
- インストール方法:drwtsn32 -i
- Debugger値
- デバッグ:-(ダンプ専用)
- ダンプ:drwtsn32 -p %ld -e %ld -g
- インストール方法:userdump -I -d 出力先パス
- Debugger値
- デバッグ時:-(ダンプ専用)
- ダンプ時:userdump -E %ld %ld -D 出力先パス
- インストール方法: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"
VisualStudio? 2010 以降 †
- インストール方法:-
- Debugger値
- デバッグ時:Debugger=vsjitdebugger.exe" -p %ld -e %ld
- ダンプ時:-
.NET Framework 4 以降 †
- インストール方法:-
- Debugger値
- デバッグ時:Debugger=cordbg.exe" !a 0x%x
- ダンプ時:-
VisualStudio? 2010 以前 †
設定場所と値が異なるが割愛
- キー:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgJIT
.NET Framework 3.5 以前 †
設定場所と値が異なるが割愛
- キー:HKEY_LOCAL_MACHINE\Software\Microsoft\.NETFramework\DbgJIT
Windows フォームで Just-In-Time デバッグを有効にするには、
本設定を併用しないとデバッガを無効化できない事がある模様。
その他の取得方法 †
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
ImageFile?タブから、対象イメージの
- enable page heapチェックボックス
- create user mode stack trace databaseチェックボックス
を有効・無効にする。
参考 †
- 致命的な例外エラーについて
http://support.microsoft.com/kb/150314/ja
プロセッサ例外とその定義
- 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: :障害対応, :性能, :デバッグ