CTC 教育サービス
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes
こんにちは。加賀結衣(かが ゆい)と申します。
このコラムでは、株式会社リックテレコムの「Windows/Linuxのトラブル追跡実践ノウハウ」をもとに、私が実際にPCに触りながら学んだことをまとめていきます。
コラム内のページ表記は、この書籍のページを示します(Pはページです)。
日々発生するコンピュータのトラブルに対し、どのようなツールを使い、どのような情報を収集すればよいか知りたいと思われている初心者の方に、このコラムが少しでもお役に立てば嬉しいです。
今回は、第4章 「プログラムを調べる」の「4.2 Windows編」を確認していきましょう。メモリダンプの取得、解析方法について学びます。
---------------------------------------------------------------------
第4章 プログラムを調べる
4.2 Windows編
4.2.1 プログラムのメモリダンプを取得する(p.200)
4.2.2 システムのメモリダンプを取得する(p.203)
4.2.3 メモリダンプを解析する(p.210)
----------------------------------------------------------------------
4.2.1 プログラムのメモリダンプを取得する(p.200)
メモリダンプとは、クラッシュダンプとも呼ばれ、実行中のプログラムについて、その瞬間の物理メモリの情報をそのままハードディスクなどに出力したファイルのことを意味します。
メモリダンプには、そのときの実行状態などが記録されるため、プログラムのクラッシュやハングアップなど、異常終了等の発生時のトラブルシュートをする有効な調査手法として利用できます。
メモリ ダンプには一般に以下の 3 種類あります。
最少メモリダンプ
カーネルメモリダンプ
完全メモリダンプ
最少メモリダンプは、Stop メッセージや停止したスレッドのカーネルモードの呼び出し履歴等、事象が発生した理由を判別するのに役立つ最小限の情報を含みます。なお、これのみでは発生したトラブルの原因追究に至る可能性は、非常に低いといえます。
カーネルメモリダンプは、カーネルメモリだけを記録します。こちらも発生したトラブルの原因追究に至る可能性は低いといえます。
完全メモリダンプは、メモリ情報の全ての内容を含むものであるため、ファイルサイズは大きくなるものの、発生したトラブル原因の調査のためには非常に有効です。
そこで、プログラムのクラッシュなど異常終了等のトラブルシュートをするときは、完全メモリダンプを採取して調査を行います。
Overview of memory dump file options for Windows
https://support.microsoft.com/ja-jp/help/254649/overview-of-memory-dump-file-options-for-windows
メモリダンプは自動もしくは手動で取得することが可能です。
・手動での取得方法
ダンプはプログラム実行中のファイルを取得することが必要であるため、ハングアップもしくはクラッシュしているアプリケーションのダンプを手動で採取する場合で、下記のようなダイアログが表示されている場合は終了をクリックする「前」にまずダンプを採取しましょう。
タスクマネージャーを起動し、[アプリケーション]タブ、または[プロセス]タブで対象プロセスを選択後、右クリックして表示されるメニューから[ダンプファイルの作成]を実行します。
ダンプファイルの作成が終了すると、作成されたファイルのパスが表示されます。
通常は、C:\Users\<ユーザー名>\APPDate\local\Temp\<プログラム名>.DMPとなります。
・自動で取得する方法
自動で取得する場合、Windows エラー報告 (WER) 機能を使用します。
1)まず、コマンド プロンプトを[管理者として実行]します。
2) 以下のコマンドを実行し、HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\Windows Error Reporting に新しいキー LocalDumps を追加します。
また、次のコマンドも実行し、LocalDumps に 2 つの値を追加します。
- 名前:DumpType、種類:Dword (32ビット) 値、データ:2 - 名前:DumpFolder、種類:展開可能な文字列、データ:ダンプの出力先の任意フォルダ reg add HKLM\SOFTWARE\Microsoft\Windows"\Windows Error Reporting"\LocalDumps /v DumpType /t REG_DWORD /d 2 reg add HKLM\SOFTWARE\Microsoft\Windows"\Windows Error Reporting"\LocalDumps /v DumpFolder /t REG_EXPAND_SZ /d <ダンプの出力先の任意フォルダ>
設定は以上です。
DumpTypeにてダンプファイルの種類を選択しています。ここではデータ:2にして完全メモリダンプを出力させます。
また、DumpFolderにてダンプの出力先フォルダを指定します。任意のパスを指定して出力させます。
4.2.2 システムのメモリダンプを取得する(p.203)
WindowsOS自体がクラッシュすると、ブルースクリーンという青い背景に白い文字の画面が表示されます。
これは、BSOD(ビーエスオーディ Brue Screen Of Death)と呼ばれ、システムの継続が不可能になるエラーが発生したことを意味します。
このようなWindowsOSで発生するクラッシュのトラブルシュートでは、システムのメモリダンプが必要となります。
メモリダンプを生成するには、ページファイルサイズを設定し、メモリダンプが生成されるよう後述のレジストリ CrashControlの設定を行います。
1.ページファイルサイズの設定
1) スタート - コンピューターにてプロパティを選択し、開いた画面で[システムの詳細設定]をクリックします。
2)システムのプロパティ画面が表示されたら、[詳細設定]タブにてパフォーマンスの[設定]をクリックします。
3) パフォーマンス オプション画面が表示されたら、[詳細設定]タブにて仮想メモリの下の「すべてのドライブの総ページングファイルサイズ」が実装メモリサイズ+300MB以上に設定されているか確認します。
値が小さい場合は設定値を変更します。
2.レジストリ CrashControlの設定
次に、レジストリエディタを管理者権限で起動し、以下のCrashDumpEnabledの値を1に設定し、PCを再起動して設定を反映させます。
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\CrashControl\CrashDumpEnabled
1は完全メモリダンプを意味します。
これ以外の値を設定することもできます。
2:カーネルメモリダンプ、3:最少メモリダンプ、0:メモリダンプを保存しない
3.手動でのメモリダンプの取得方法
1) スタート - コンピューターにてプロパティを選択し、開いた画面で[システムの詳細設定]をクリックします。
2)システムのプロパティ画面が表示されたら、[詳細設定]タブにて起動と回復の[設定]をクリックします。
3)起動と回復画面が表示されたら、メモリダンプの種類を[完全メモリダンプ]にしてOKをクリックします。
4)次に、 [レジストリ エディター] を管理者として実行し、以下のキーを選択します。
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControlに新しいキー NMICrashDump を追加し、値を 1 に設定します。
5)PCを再起動します。
4.手動でのメモリダンプの作成方法
キーボードからの割り込み処理を有効にするため、キーボードの種類に合わせてレジストリの設定を行います。どちらか判別できない場合は両方の設定を行います。
USBキーボードの場合
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\kbdhid\Parameters\CrashOnCtrlScroll
値:1
PS/2キーボードの場合
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\i8042prt\Parameters\CrashOnCtrlScroll
値:1
以下は設定例です。
設定を反映させるため、PCを再起動します。
[参考]
メモリ ダンプ ファイルを生成する方法について
https://blogs.technet.microsoft.com/askcorejp/2014/08/10/339/
4.2.3 メモリダンプを解析する(p.210)
取得したメモリダンプは、WinDbgというデバッガーで読み込んで解析することでクラッシュの概要をつかむことができます。
WDK、WinDbg、関連ツールのダウンロード
https://developer.microsoft.com/ja-jp/windows/hardware/windows-driver-kit
上記ページ内にある「Debugging Tools for Windows (WinDbg) を SDK から入手する 」をクリックしてWinDbgを入手します。
https://go.microsoft.com/fwlink/p/?LinkId=536682
Windbgを入手したら、管理者権限で開きます。
次にシンボル情報を入手します。
シンボル情報はP.212に記載の手順でMicrosoft シンボル サーバーを使う他、OSによっては、シンボル パッケージをダウンロードしてコンピューターにインストールできます。
https://developer.microsoft.com/ja-jp/windows/hardware/download-symbols
シンボル情報とともにメモリダンプを解析することで、ダンプ生成時に実行されていた関数の名前等がわかるようになります。
メモリダンプは、WinDbgの[File]メニューから[Open Crash Dump...]を開いて、対象のダンプファイルのパスを指定することで読み込むことができます。
以下は、C:\Windows\MEMORY.DMPを開いた例です。
「Bugcheck Analysis」と表示された箇所の下を見ていただくと、クラッシュの概要をつかむことができます。
Bug Check Code Reference
https://msdn.microsoft.com/en-us/library/windows/hardware/hh994433(v=vs.85).aspx
本書では、Bug check E2、つまり 0x000000E2 MANUALLY_INITIATED_CRASHが表示されておりますが、上記の例の場合、Bug check 19、つまり0x00000019 BAD_POOL_HEADER と表示されていることが確認できます。
なお、「Bugcheck Analysis」の下に記載されているコマンド[!analyze -v]をWinDbgの最下部に入力してEnterをクリックすると、より詳細な情報を得ることができます。
★メモリダンプ(クラッシュダンプ)を利用すると、プログラムのクラッシュやハングアップなど、異常終了等の発生時、有効な調査手法となります。
★有効な情報を得るためには、完全メモリダンプの取得を取得するための事前設定が必要です。
★取得したメモリダンプは、WinDbgというデバッガーで読み込んで解析することでクラッシュの概要をつかむことができます。
なお、サーバ(OS)・ネットワーク分野における原因究明の仕方や切り分けなどを行う方法を基礎から学びたい方には、CTC教育サービスのオリジナルコースである
「システムトラブルシュート(ファーストステップ)」
「システムトラブルシュート(ネクストステップ)」がお勧めです。
詳細は、以下のリンクをご参照くださいませ。
http://www.school.ctc-g.co.jp/course/SSE01.html
http://www.school.ctc-g.co.jp/course/SSE02.html
最後まで読んでくださってどうもありがとうございました。次回もどうぞお楽しみに。
[IT研修]注目キーワード Python UiPath(RPA) 最新技術動向 Microsoft Azure Docker Kubernetes