#navi_header|技術|
Windows XP SP3, Windows 7 上でのメモリダンプ取得方法メモ。
基本的に "Debugging Tools for Windows" 無しの状態を想定しています。つまりユーザー環境でアプリケーションクラッシュやハングアップ、あるいはBSODが発生した瞬間を捕まえるための設定をメモしていきます。
なお一部のシナリオではMicrosoftから公開されている"UMPD : User Mode Process Dumper"というツールを使っています。
以下の環境で動作確認しています。いずれも日本語版のWindowsを使っています。
Windows XP SP3 : x86(32bit), Windows 7 上のXP Modeを利用
→ Win2k, WinSrv2003 など
Windows 7 : x86(32bit)
→ Vista, WinSrv2008 など
#more||
参考図書:
#amazon||>
||<
#amazon||>
||<
- "AWD本" : "Advanced Windows Debugging"
- 「Windowsダンプの極意」:第1版第5刷
----
#outline||
----
* アプリケーションのメモリダンプ
アプリケーションのメモリダンプを取得する方法のメモ。クラッシュなど例外発生時に自動的に取得する方法と、任意のタイミングで取得する方法(デッドロックなどで無応答になったり、CPU100%などのハングアップ状態に陥ったとき)の二種に大別して紹介する。
** UMPD : User Mode Process Dumper のインストール
UMPDが必要になる場面:
- 任意のタイミングでメモリダンプを取得したい
- クラッシュ時にワトソン博士ではダンプが取得できない(まれにあるらしい)。
対応OS:Win2k SP3,SP4/WinSrv2003 NonSP,SP1,SP2/WinXP SP1,SP2
他、WinXP SP3でも動くようです(当記事でWinXP SP3で確認)。
情報とダウンロード:
- Microsoft Support Professionals Toolkit for Windows
-- http://www.microsoft.com/japan/windowsserver2003/downloads/supporttools.mspx
- Download details: User Mode Process Dumper Version 8.1
-- http://www.microsoft.com/downloads/en/details.aspx?FamilyID=E089CA41-6A87-40C8-BF69-28AC08570B7E&displaylang=en
以降の記事では UserModeProcessDumper8_1_2929_5.exe を使っています。
インストール:
+ ダウンロードリンクからexeをDLし、実行するとunzip解凍先が聞かれる。
+ デフォルトでは "C:\kktools\userdump8.1" になっている。特に変更する必要がなければそのままunzip。
+ クラッシュ時にダンプを取得させたい場合は、"userdump8.1"フォルダ以下の各アーキテクチャフォルダにあるsetup.exeを使ってシステムにインストールする。"%WINDOWS%\system32\kktools"以下にインストールされ、PATH環境変数にも同フォルダが自動で追加される。
++ 任意のタイミングで取得したいだけであれば、setup.exeのインストールは不要です。
setup.exeからのインストールの流れ:
&image(yb://images/winmemdump/umpd_setup_1.jpg)
↓
&image(yb://images/winmemdump/umpd_setup_2.jpg)
↓
&image(yb://images/winmemdump/umpd_setup_3.jpg)
↓
&image(yb://images/winmemdump/umpd_setup_4.jpg)
以上でインストールは終わり。使い方については以降の説明を参照。
ちなみに、UMPDには富士通・日立・日本ユニシス・NTTデータ・東芝が開発に関わっているようです。
** アプリケーションクラッシュ時に取得
例外発生などでアプリケーションがクラッシュしたときに自動的にメモリダンプを取得する方法を紹介します。
*** Windows XP SP3 (ワトソン博士を使う場合)
参考:「Windows ダンプの極意」p50-51
1.ワトソン博士(OSが提供するデバッガ)がデフォルトのデバッガになっているかチェック。
> reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug" /v Debugger
...
Debugger REG_SZ drwtsn32 -p %ld -e %ld -g
^^^^^^^^^^^^^^^^^^^^^^^^^^ : O.K.
もしVisualStudioやDebugging Tools for Windowsのデバッガが設定されている場合は、
> drwtsn32 -i
とすることでワトソン博士に変更できる。
2.アプリケーションクラッシュ時に自動的にデバッガ(ワトソン博士)が起動することをチェック。
> reg query "HKLM\Software\Microsoft\Windows NT\CurrentVersion\AeDebug" /v Auto
...
Auto REG_SZ 1
^ : O.K.
"0"になっている場合は1に変更する。
3.ワトソン博士の設定をチェック。
ログファイルパス, クラッシュダンプのファイル名を確認。例:
ログファイルパス:
C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson
クラッシュダンプファイル名:
C:\Documents and Settings\All Users\Application Data\Microsoft\Dr Watson\user.dmp
クラッシュダンプの種類は「完全」を選択しておく。オプションはデフォルトのままにしておく。
下記スクリーンショット参照。
&image(yb://images/winmemdump/appdump_drwtsn32.jpg)
適当なアプリで例外を発生させると、ログがログファイルに記録され、ダンプファイルが作成される。ダンプファイルはwindbgなどで読み込むことが出来る。
※エラー報告機能の影響でアプリクラッシュが分かりづらい場合は、エラー報告を無効にする。
「マイコンピュータ」右クリック→「システムのプロパティ」→「詳細設定」タブ→「エラー報告」で「エラー報告を無効にする」を設定する。
*** Windows XP SP3 (UMPD : User Mode Process Dumper を使う場合)
参考:「Windows ダンプの極意」p54
ワトソン博士でダンプを取得できない場合があるらしい。その場合はUMPDを使う。
+ UMPDをsetup.exeを使ってインストールする(前述)。
+ コントロールパネルから「Process Dumper」を起動し、「Process Monitoring」タブを開き、クラッシュするアプリケーションおよびUMPDで補足したい例外の種類を設定する。
+ アプリケーションを起動し、クラッシュさせるかクラッシュするのを待つ。クラッシュするとUMPDで設定したフォルダに「実行ファイル名+PID+".dmp"」というファイル名でダンプファイルが作成される。
設定例:AWD本のサンプル、02sample.exeを設定してみた。
&image(yb://images/winmemdump/umpd_conf_1.jpg)
↓ "Add"ボタンをクリックしてアプリの実行ファイル名を指定する。
&image(yb://images/winmemdump/umpd_conf_2.jpg)
↓ アプリ毎に設定を調整したい場合は、「Process Monitoring」タブで追加したアプリ名をクリックし、下部「Rules」ボタンをクリック。
&image(yb://images/winmemdump/umpd_conf_3.jpg)
↓ 「Use custom rules」を選択し、調整する。(「Use default rules」の場合デフォルト設定が使われる。デフォルト設定は「Process Monitoring」タブ画面下部の「Default Settings」ボタンをクリックして開く設定画面から変更できる。)
&image(yb://images/winmemdump/umpd_conf_4.jpg)
*** Windows 7
参考:AWD本Chapter15, p743
Vista/Svr2008以降はWindows Error Reportingが大幅に改良され、ワトソン博士も外された。
- What's New in WER (Windows)
-- http://msdn.microsoft.com/en-us/library/bb513640.aspx
--- "MSDN Library" > "Windows Development" > "Diagnostics" > "Windows Error Reporting" > "What's New in WER"
AWD本Chapter15, p743ではWER関連レジスタの"ForceQueue"値を編集することでダンプファイルをローカルに保存する方法が紹介されている。
本記事ではMSDNで紹介されているWER関連レジスタの"LocalDumps"キーを使ったダンプ方法を紹介する。キー自体はWER配下にあるが、他のWER機構とは独立しているため、エラー報告を無効にしていたり、あるいはエラー報告のダイアログボックスで「送信しない」をクリックした場合でも取得できる。
- Collecting User-Mode Dumps (Windows)
-- http://msdn.microsoft.com/en-us/library/bb787181.aspx
--- "MSDN Library" > "Windows Development" > "Diagnostics" > "Windows Error Reporting" > "Using WER" > "Collecting User-Mode Dumps"
設定例:
以下のregコマンドを管理者として実行したコマンドプロンプトから実行する。
"HKLM\..." は "HKLM\SOFTWARE\Microsoft\Windows\Windows Error Reporting\LocalDumps" に読み替えてください。
reg add "HKLM\..." /v DumpFolder /t REG_EXPAND_SZ /d ^%LOCALAPPDATA^%\CrashDumps /f
reg add "HKLM\..." /v DumpCount /t REG_DWORD /d 10 /f
reg add "HKLM\..." /v DumpType /t REG_DWORD /d 2 /f
reg add "HKLM\..." /v CustomDumpFlags /t REG_DWORD /d 0 /f
上記設定の内容:
ダンプファイルの保存場所は "%LOCALAPPDATA%\CrashDumps"
上記フォルダに保存するダンプファイルの最大数は 10
フルダンプ(DumpType = 2)
(フルダンプなので使われないが、一応デフォルト値として設定)カスタムダンプ種類:通常(0)
CustomDumpFlagsはDumpType=0, CustomDumpの場合に使われる。
** 任意のタイミングで取得
デッドロックなどで無応答になったり、CPU100%で操作を受け付けなくなったときにメモリダンプを取得する方法を紹介します。
*** Windows XP SP3
UMPDを使う。unzipした段階で使える。setup.exeのインストールは不要。
+ コマンドプロンプトを開き、unzipしたフォルダ(デフォルトは"C:\kktools\userdump8.1")中のご使用のアーキテクチャのフォルダにCDする。
+ "userdump.exe -p"でプロセス一覧を表示し、対象アプリのPIDか実行ファイル名を確認。
+ "userdump.exe PID or 実行ファイル名"でダンプ取得。
実行例:
#pre||>
> userdump -p
C:\kktools\userdump8.1\x86>userdump -p
User Mode Process Dumper (Version 8.1.2929.5)
Copyright (c) Microsoft Corp. All rights reserved.
0 System Idle Process
4 System
600 smss.exe
...
2064 cmd.exe
1268 10DeadLock.exe
788 userdump.exe
> userdump 1268
User Mode Process Dumper (Version 8.1.2929.5)
Copyright (c) Microsoft Corp. All rights reserved.
Dumping process 1268 (10DeadLock.exe) to
C:\kktools\userdump8.1\x86\10DeadLock.dmp...
The process was dumped successfully.
||<
"svchost.exe"のように複数起動しているプロセスを指定した場合は、「svchost + PID + .dmp」というダンプファイル名でそれぞれのプロセスダンプを取得できる。
#pre||>
> userdump svchost.exe
User Mode Process Dumper (Version 8.1.2929.5)
Copyright (c) Microsoft Corp. All rights reserved.
Dumping process 920 (svchost.exe) to
C:\kktools\userdump8.1\x86\svchost920.dmp...
The process was dumped successfully.
(...)
Dumping process 1512 (svchost.exe) to
C:\kktools\userdump8.1\x86\svchost1512.dmp...
The process was dumped successfully.
> dir svc*.dmp
...
2011/02/13 09:56 79,449,566 svchost1144.dmp
2011/02/13 09:56 24,162,167 svchost1220.dmp
2011/02/13 09:56 32,242,271 svchost1292.dmp
2011/02/13 09:56 34,269,822 svchost1512.dmp
2011/02/13 09:56 37,085,120 svchost920.dmp
2011/02/13 09:56 32,818,123 svchost988.dmp
...
||<
*** Windows 7
Vista, Win7以降ではタスクマネージャーから任意のタイミングでメモリダンプを取得できる。次のKBを参照。
- Windows Vista でユーザーモード プロセスのダンプ ファイルを作成する方法
-- http://support.microsoft.com/kb/931673
- タスクマネージャーで取得できるダンプは「フルダンプ」になる。
- SysinternalsのProcess Explorerを使うと、プロセスを右クリック→「Create Dump」から「Mini Dump」か「Full Dump」かを選択できる。
- Process Explorerではダンプファイル名と保存場所を指定できるが、タスクマネージャー経由では指定できない("AppData\Local\Temp"以下)。
* システムのメモリダンプ
OSのCrashDumpの取得方法を紹介する。なお「カーネルダンプ」という単語はダンプの種類の一つを指してしまうため、いわゆるBSOD、OSのCrashによるメモリダンプをここでは「システムのメモリダンプ」と便宜上呼んでおく。
設定方法はWinXPとWin7でほとんど変わりません。2011年現在、MicrosoftのKBなどWeb上に資料が揃っていますので、詳細はそちらを参照してください。
参考資料:
- 「Windows ダンプの極意」p43-
- Windows: Understanding Crash Dump Files
-- http://www.ditii.com/2008/01/08/windows-understanding-crash-dump-files/
- Windows でシステム障害と回復のオプションを構成する方法
-- http://support.microsoft.com/kb/307973/ja
- Windows Vista、Windows Server 2008 R2、Windows Server 2008、Windows Server 2003、Windows XP、および Windows 2000 のメモリ ダンプ ファイル オプションの概要
-- http://support.microsoft.com/kb/254649/
- システムが予期せず停止した場合の動作を指定する
-- http://technet.microsoft.com/ja-jp/library/cc778968%28WS.10%29.aspx
- Windows BSOD analysis - A thorough usage guide
-- http://www.dedoimedo.com/computers/windows-bsod.html
NMIを使ったりWindows Server2008 だったり、エンタープライズサーバー向けのKB:
- How to generate a kernel or a complete memory dump file in Windows Server 2008
-- http://support.microsoft.com/kb/969028/
- How to generate a complete crash dump file or a kernel crash dump file by using an NMI on a Windows-based system
-- http://support.microsoft.com/kb/927069/
** 任意のタイミングで取得(=BSOD発生)
任意のタイミングで取得する方法として、キーボード操作でSTOPエラー→BSODを発生させる方法と、"StartBlueScreen"というツールを使って任意のパラメータでKeBugCheckEx()実行→BSODを発生させる方法の二種類を紹介する。
*** PS/2接続 or USB接続のキーボードでCtrl + ScrollLock x 2でSTOPエラー発生→ダンプ取得
- キーボード操作でメモリ ダンプ ファイルを作成できる Windows の機能
-- http://support.microsoft.com/kb/244139/
キーボード操作で~の場合のレジストリ設定例 ''(PS/2接続専用)'' :管理者として実行したコマンドプロンプトで以下を実行:
reg add HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters \
/v CrashOnCtrlScroll /t REG_DWORD /d 1 /f
レジストリ設定後、再起動。なおCtrlを押しながらScrollLockを二度押しでBSODになるが、 ''この時押すCtrlキーはSpaceの右側のCtrlキーなので間違えないよう注意。''
キーボード操作によるSTOP発生を無効化するには、上記レジストリに0を設定して再起動する。
reg add HKLM\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters \
/v CrashOnCtrlScroll /t REG_DWORD /d 0 /f
USB接続キーボードの場合は、次のレジストリキーが対象となる。CrashOnCtrlScrollやその値はPS/2の時と同様。
HKLM\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters
なおWinSrv2003の場合のみ、KB244139にも記載があるがドライバのアップデートが必要。それ以外のバージョンであればドライバのアップデートは不要。(Win7では不要だった)
*** StartBlueScreenでコマンドラインからBSOD発生→ダンプ取得
- StartBlueScreen - Initiate a Blue Screen of Death (BSOD) in Windows operating system
-- http://www.nirsoft.net/utils/start_blue_screen.html
StartBlueScreenはコマンドラインからKeBugCheckEx()に与えるパラメータを設定できます。詳しくは上記WebサイトおよびDLしたアーカイブ中のreadmeファイルを参照してください。
** STOPエラーなどBSOD発生時のダンプの取得設定(種類や保存場所)
基本的に「起動と回復」設定でダンプの種類や保存場所、Crash発生時の挙動を設定する。設定後の再起動は不要。
- WinXPの場合:
-- 「コントロールパネル」→「システム」(デスクトップ上のマイコンピュータを右クリック)→「システムのプロパティ」→「詳細設定」→「起動と回復」→「詳細」ボタンクリック
- Win7の場合:
-- 「コントロール パネル」→「システムとセキュリティ」→「システム」の左ペイン、「システムの詳細設定」→「起動と回復」→「詳細」ボタンクリック
ダンプの種類で「完全メモリダンプ」を指定した場合は、Crash時に一旦全物理メモリを書き出すため、ブートボリューム上に十分な大きさのページングファイルと空き容量が必要。ページングファイルサイズの設定は基本的に「パフォーマンスオプション」から設定する。設定変更後は再起動が必要。
- WinXPの場合:
-- 「コントロールパネル」→「システム」(デスクトップ上のマイコンピュータを右クリック)→「システムのプロパティ」→「詳細設定」→「パフォーマンス」→「詳細」ボタンクリック→「パフォーマンスオプション」の「詳細設定」タブ→「仮想メモリ」→「変更」ボタンクリック
- Win7の場合:
-- 「コントロール パネル」→「システムとセキュリティ」→「システム」の左ペイン、「システムの詳細設定」→「パフォーマンス」→「詳細」ボタンクリック→「パフォーマンスオプション」の「詳細設定」タブ→「仮想メモリ」→「変更」ボタンクリック
--- "初期サイズ"を「すべてのドライブの総ページングファイルサイズ」の推奨値以上に設定しておけば「完全ダンプ」でも安心。
*** WinXPでの設定例
「起動と回復」設定のデフォルト:
&image(yb://images/winmemdump/oscrash_xp1_default.jpg)
「自動的に再起動する」をオフにしてBSOD画面を表示させる+ダンプの種類をカーネルメモリダンプに変更:
&image(yb://images/winmemdump/oscrash_xp2_kmd.jpg)
ページングファイルサイズの設定:XPModeで512MBのRAMを割り当ててあり、初期値を「推奨」以上に設定済み:
&image(yb://images/winmemdump/oscrash_xp3_disk.jpg)
BSOD:
&image(yb://images/winmemdump/oscrash_xp5_bsod.png)
BSOD→再起動後、ログインしたあとでデスクトップに表示されるメッセージボックス:
&image(yb://images/winmemdump/oscrash_xp4.jpg)
*** Win7での設定例
「起動と回復」設定のデフォルト:
&image(yb://images/winmemdump/oscrash_w71_default.jpg)
BSOD→再起動後、ログインしたあとでデスクトップに表示されるメッセージボックス:
&image(yb://images/winmemdump/oscrash_w73.jpg)
&image(yb://images/winmemdump/oscrash_w74.jpg)
*** 2GB以上のRAM搭載時の完全メモリダンプの取得
実験に使ったWin7は4GBのRAMを搭載している(32bitOSなので利用可能なのは3GBまで)。
このため、「起動と回復」設定からは「完全メモリダンプ」を選択できない。そもそも「デバッグ情報の書き込み」のダンプ種類を選択するプルダウンメニューに「完全メモリダンプ」の項目が無い。
&image(yb://images/winmemdump/oscrash_w72_nofull.jpg)
レジストリを手動で設定することで「完全メモリダンプ」にすることが出来る。
レジストリキー:
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl
値:
CrashDumpEnabled REG_DWORD 0x1 <= 「完全メモリダンプ」
管理者として実行したコマンドプロンプトから下記のコマンドを実行することでもCrashDumpEnabledを1に変更できる。
wmic recoveros set DebugInfoType = 1
ページングファイルサイズも手動で設定しなおす。
デフォルトでは自動管理になっていた:
&image(yb://images/winmemdump/oscrash_w75_pfs.jpg)
カスタムサイズにして、初期値を推奨値以上に設定し、 ''「設定」ボタンをクリックする。'' 「設定」ボタンのクリックを忘れると、設定値が反映されない。
&image(yb://images/winmemdump/oscrash_w76_pfs.jpg)
再起動後念のため確認:
&image(yb://images/winmemdump/oscrash_w77_pfs.jpg)
以上の設定で、完全メモリダンプが有効になる。
#navi_footer|技術|