メモリダンプの中身を確認

# はじめに

私は最近までWindowsサーバの運用保守を行っておりました。
その中でサーバに不具合が発生した場合の動作確認や調査として、
・イベントログの確認
・サービスの起動状態の確認
・リソース使用状況の確認

等は行ってきましたが、それ移行に行う、以下のような解析は実施してきませんでした。
・イベントログとメモリダンプをMSのサポートに送付して解析してもらう
・HW系であれば、HWログをベンダーに送付して解析してもらう
・アプリケーションログをアプリケーションベンダーに送付して解析してもらう

そのため、今回はメモリダンプの中身を見て不具合の原因を探れるよう学習しました

# メモリダンプ出力とツール解析
####1. メモリダンプを出力させられるサーバを用意
今回はAWSのEC2WindowsServerを用意しました。
クラウドは負荷テストや、このような学習目的で予期せぬ挙動を
実行させられる環境を直ぐに調達できて素晴らしいです
<img width="669" alt="001.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/7a50b3e6-5bf7-0fe7-1905-2fba1cbac24d.png">


####2.メモリダンプを吐かせる
メモリダンプの出力は、**Notmyfault**を利用しました。
Notmyfaultは、Windowsシステムでクラッシュ、ハング、およびカーネルメモリリークを
引き起こすために使用できるツールです。ツールは[こちら](https://docs.microsoft.com/ja-jp/sysinternals/downloads/notmyfault)にあります

2-1. Notmyfaultを実行
<img width="376" alt="002.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/65d5840d-50c4-5680-c251-2763e7199a0f.png">

2-2. ダンプを吐かせたいエラーを選択しCrashを押下
<img width="545" alt="003.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/b88920fc-4abc-e829-5d28-36401c4fc671.png">

エラーについて調べましたがこのような内容でした

|エラー名  |内容  |
|---|---|
|High IRQL fault (Kerner-mode)  |割り込み要求に与えられる優先度が高すぎて本来アクセスするべきではない領域にアクセスしようとした(カーネルモード)  |
|Buffer overflow  |プログラムで用意されたバッファよりも大きなサイズのデータをバッファに書き込む事  |
|Code overwrite   |Code overwriteそのももの説明がみつから無かったですが、STOPが0x000000beで、これはドライバーが読み取り専用メモリセグメントに書き込もうとしている場合と[Docs](https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xbe--attempted-write-to-readonly-memory)に記載がありました |
|Stack trash  |Stack trashそのももの説明がみつから無かったですが、STOPが0x0000001eで、これはカーネルモードプログラムが、エラーハンドラーがキャッチしなかった例外を生成と[Docs](https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0x1e--kmode-exception-not-handled)に記載がありました |
|High IRQL fault (User-mode)   |割り込み要求に与えられる優先度が高すぎて本来アクセスするべきではない領域にアクセスしようとした(ユーザモード)   |
|Stack overflow  |プログラムを組んでいる最中で関数の呼び出しが多すぎる時に発生(無限ループ) |
|Hardcoded breakpoint  |Hardcoded breakpointそのももの説明がみつから無かったですが、STOPが0x0000003bで、これは特権のないコードから特権コードに遷移するルーチンの実行中に例外が発生と[Docs](https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0x3b--system-service-exception)に記載がありました  |
|Double free  |同じメモリー領域を二重に解放しメモリーの内容を破損 |

2-3. 切断が切れたことの確認(運用保守でヒヤヒヤする画面(・_・;))
<img width="469" alt="004.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/74b75d1f-f662-4b88-3dbc-78f708dc1064.png">

2-4. 予期せぬ再起動が発生した画面を確認
<img width="643" alt="005.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/2c78b30c-22f0-b449-68fa-a8145495f192.png">

2-5. イベントログからbugcheckコード(0x000000d1)とC:\Windows\MEMORY.DMPにメモリダンプが保管されていることを確認
<img width="743" alt="007.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/d2fd77c5-94c0-52f1-5549-7c3b79690a88.png">

以下Docsでbugcheckコード(0x000000d1)を確認できます

- 0x000000D1:割り込み要求レベル (IRQL) が高すぎたときに、ページング可能な (または完全に無効な) 
アドレスにアクセスしようとしたことを示す

https://docs.microsoft.com/ja-jp/windows-hardware/drivers/debugger/bug-check-0xd1--driver-irql-not-less-or-equal

####3.解析ツールを入れて中身を確認
3-1. 解析ツールのインストール
[こちら](https://developer.microsoft.com/en-us/windows/downloads/windows-10-sdk)からWindows 10 SDKのインストーラを落とします。
インストーラを実行するとダンプ解析ツールWindbgを含む機能がインストールされます。

3-2. Windbg(X64)の実行
<img width="430" alt="008.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/fb4632e9-2939-9c80-b246-cf65bc7ff841.png">

3-3. Open Crush Dumpを押下し↑の2で取得したメモリダンプを指定
<img width="703" alt="009.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/dc089667-fa7f-a1af-54d7-167a95dda11b.png">

3-4. run !analyze -vを押下し詳細を表示
<img width="544" alt="010.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/539167d8-98be-4f88-472b-d867e6b7fa70.png">

3-5. PROCESS_NAMEやIMAGE_NAMEで被疑のを確認
Notmyfaultを確認することができました。
↑の2-5と併せて、Notmyfaultを実行した時にIRQLが高くページング可能な (または完全に無効な)
アドレスにアクセスしようとしたため発生させたと推測できます
<img width="646" alt="012.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/3bca3dad-477a-ab92-b003-8c52eaaa96d8.png"><img width="623" alt="013.PNG" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/322881/c70acbbb-4de4-075a-fdfa-bb7faa420107.png">


# 感想、その他
- 以下のtechnetを参考にさせていただきましたが、
こちらの記事は10年以上前の記事です。このような10年前記事があるのに、
運用中に自分でメモリダンプを見てみようと行動しなかったことを反省してます。
https://blogs.technet.microsoft.com/askcorejp/2009/05/22/10/

- 記事とはあまり接関係はないのですが、リソースモニタとタスクマネージャの違いが
解り易く記載されていたサイトがあったので運用の方は是非以下をご覧になってみてください。
運用者は楽してタスクマネージャだけ見がちなので。。。
http://tooljp.com/windows/chigai/html/Windows/taskmanager-ResourceMonitor-chigai.html