-
Notifications
You must be signed in to change notification settings - Fork 0
MS_CrashDump
-
TOP > トラブルシュート > ダンプの概要(種類と取得)
-
ユーザモード・プロセス・ダンプ
- クラッシュ・ダンプ
- ハング・ダンプ
-
ユーザモード・プロセス・ダンプ
- クラッシュ時にプロセスに事後分析デバッガをアタッチしてダンプを取得する。
- 問題が起きた時刻に近い情報(メモリ&スタック)を取得可能であるが、
上記に問題の情報が含まれないケースや、マルチスレッド環境下などで、
重要な情報をタイミングによって取り逃がしているケースはあり得る。 - クラッシュしたスレッドのスタックを見ることで、
クラッシュを起こしているプログラムコードの部位の特定が比較的容易。
OSや対象プロセス(マネージド、アンマネージド)によって
使用するツール・手順・設定等が異なるのでサポートと連携して行う。
以下は、クラッシュ・ダンプの専用ツール。
ハング・ダンプと併用可能なツールはダンプ取得に使用するツールの一覧を参照。
- 以下のツールを使用できる。
- ただし、マネージド・プロセスのクラッシュ・ダンプは取得不可。
この場合は、ADPlus(か、cdb.exe単独実行)を利用する。
- Windows OS標準のデバッガでクラッシュ・ダンプ・ファイルを生成できる。
- ファイル名を指定して実行:「drwtsn32」でワトソン博士の設定画面が開く。
- ただし、Vista以降のOSでは使用できない。
補足(最新化): ワトソン博士(Dr. Watson)の後継が WER(Windows Error Reporting) で、Vista 以降はこちらが標準。 現在は前述の
LocalDumpsレジストリ設定でダンプを自動保存するのが最も簡単。
UMPD、WinDbg、CDB、NTSD のオプション指定により
CLRの例外発生時のマネージコードのクラッシュダンプ取得も可能。
※ 現在の .NET(Core 以降)では、環境変数
DOTNET_DbgEnableMiniDump=1 / DOTNET_DbgMiniDumpType を設定するだけで、
未処理例外時にランタイムがダンプを出力できる(クロスプラットフォーム)。
未処理例外 = セカンドチャンス(ラストチャンス)例外
- 通常は無害な(ハンドリングされた)ファーストチャンス例外は無視して継続する。
- セカンドチャンス(ラストチャンス)例外の通知により、
事後分析デバッガ(ダンプツール)をアタッチしてダンプを出力する。
無害な(ハンドリングされた)例外
※ 正確には「デバッガに最初に通知された時点」の例外を指す。
アプリの catch で処理されればそこで終わり(セカンドチャンスにならない)。
- .NETのランタイム(
mscorwks.dll内部)でAccess Violation等の例外が発生した場合、
.NETでは、ユーザアプリケーションでは例外をハンドルできない仕様となっている。 - この場合、ファーストチャンス例外発生後に、イベントログを出力しプロセスを終了するので、
セカンドチャンス例外が発生せず、クラッシュダンプをデバッガから取得できない。 - このため、このようなケースではファーストチャンス例外の監視機能を持つ
UMPDやADPlusなどのダンプ取得ツールを使用してクラッシュダンプを取得する。
移行メモ(誤記): 原文の
mccorwks.dllはmscorwks.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 -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 -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 -iae - Debugger値
- デバッグ時:
ntsd.exe -p %ld -e %ld -g - ダンプ時:
ntsd.exe -p %ld -e %ld -g -c ".dump /o /ma /u 出力先パス\new.dmp; q"
- デバッグ時:
- 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)の誤記。
プログラムはクラッシュさせずに自前の未処理例外フィルタを実行することもできる。
また、ここでセルフダンプの取得を行う事もできる。
- 通常、ユーザモード・プロセス・ダンプのハング・ダンプを使用する。
- メモリ・リークに起因する OutOfMemory 等で異常終了する場合はクラッシュ・ダンプでも可。
また、グローバルフラグを設定して
- ヒープリーク検出機能(ページ ヒープ)
→!heap -p -aコマンドで stacktrace を出力可能にする(必須)。 - ユーザモード スタックトレース データベース
→!heap -aコマンドで stacktrace を出力可能にする(オプション)、UMDH 用(必須)
を有効にする必要がある。
ページ ヒープをオンにした場合、ヒープオーバーランの検出も可能になる。
※ ヒープに対するバッファオーバーランをヒープオーバーランと呼ぶ。
ページ ヒープ、ユーザモード スタックトレース データベースはメモリを使用するため、
調査後には無効にする。
グローバルフラグの設定には、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 チェックボックス
を有効・無効にする。
- net45_exception.zip(.NET Framework 4.5 における例外の検証資料)
- 例外 - Web-DB プログラミング徹底解説
- ページヒープ (PageHeap) によるヒープオーバーランの検出
- Just-In-Time デバッガーを使用してデバッグする - Visual Studio
- ユーザー モード ダンプの収集 - Microsoft Learn
| # | 例外 |
|---|---|
| 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: 障害対応, 性能, デバッグ
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。