分析Memory Dump基礎篇
相信使用 Windows 作業系統大家都有藍色畫面的經驗,
整台電腦 “當機”,這時候只有重新開機一途。
更進一步我們如果要追查藍色畫面的原因,就必須進一步收集所謂的 Memory Dump,
也就是當下電腦記憶體中所有執行的程式、執行緒、工作、開啟的檔案等等。
這篇文章主要說明如何取得 Memory Dump 並且做進一步初步的分析。
如何抓取完整 Memory Dump?
一個簡單的方式當然就是製造藍色畫面,但是這樣一來電腦必須要重新開機。
方法一:NotMyFault
https://download.sysinternals.com/files/NotMyFault.zip
這個工具執行時,會產生藍色畫面因此讓 windows 自動產生整個 Memory Dump。
步驟1: 設定 registry
執行這個工具之前先確定 memory dump 是否正確被設定,
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\CrashControl
CrashDumpEnabled
= 1 (這會設定產生完整的 memory dump)
步驟2: 執行 NotMyFault
用系統管理員權限於 Command console 下執行下列指令
NotMyFault.exe /crash |
結果會出現藍色畫面,所以執行之前先確定相關的工作有存檔。
藍色畫面出現後就必須要重新開機。
所產生的 Memory Dump 預設會被存放在 %SystemRoot%\MEMORY.DMP
(PS. 藍色畫面上的特定 Error Code 是有意義的,可以根據這個 Error code 查詢錯誤的原因)
限制:這個方法不適用在 Virtual Machine
方法二:使用 WinDbg
如果不重新開機也不刻意產生藍色畫面,有什麼方式可以產生完整的 memory dump呢?
我們主要使用的工具是 WinDBG
首先我們必須安裝 WinDBG,可以至下列位置下載
http://msdn.microsoft.com/en-US/windows/hardware/gg463009
Microsoft Windows SDK for Windows 7 and .NET Framework 4 http://go.microsoft.com/fwlink/?LinkID=191420
安裝的時候可以指定安裝 “Debugging Tools for Windows”也就是俗稱的 winDBG
安裝完 Windbg 之後就可以利用這個工具產生 dump
工具啟動後如畫面所示,於 kd提示符號之後輸入指令
.dump /?
(注意: dump指令前面必須要含有 . 的符號)
相關指令參數可以參考: https://msdn.microsoft.com/en-us/library/windows/hardware/ff562428(v=vs.85).aspx
如果要產生完整Kernel Mode Dump | .dump /f C:\memory.dmp | |
如果要產生 user mode Dump | .dump /m C:\memory.dmp | |
如果要產生 User mode + 其他資訊 | .dump /mfh C:\memory.dmp |
如何分析?
開啟 WinDbg.exe 之後
1. 設定 Symbol
File > Symbol file path > “SRV*c:\symbols*http://msdl.microsoft.com/download/symbols”
2. 開啟 Memory Dump
File > Open Crash Dump > ! analyze -v
如果是 Crash 的問題通常 windbg 就會給初步分析的原因。
但是如果是系統效能很慢或是應用程式無法回應的問題的話,就必須進一不釐清是否有下列狀況
- Infinite loop
- Intensive IO operations
- Huge allocations to the Large Object Heap
- Any intensive CPU operations.
可以參考這篇,系統無法回應 hang 問題的分析
http://blogs.msdn.com/b/rihamselim/archive/2012/03/01/debugging-2.aspx
方法三: 使用 VMware 工具
這個方式主要將 VMware 當下的 Image Suspended
再利用VMware 工具 vmss2core將該 Suspended Image 轉換為Memory Dump
缺點是當系統有問題的時候那當下或許沒有辦法 Suspended.
因此這種情況下,可以利用方法二利用 Windbg 工具產生。
Kernel Dump 分析
如果要分析這樣的 Memory Dump,可以使用 Windbg > File > Open Crash Dump
Kernel dump的分析 有下列指令可以使用:
進階分析參考資料
http://blogs.msdn.com/b/rihamselim/archive/2012/02/25/windbg-debugging-2.aspx
http://blogs.msdn.com/b/rihamselim/archive/2012/03/01/debugging-2.aspx
http://blogs.msdn.com/b/rihamselim/archive/2012/03/08/debugging-3.aspx
http://blogs.msdn.com/b/rihamselim/archive/2012/03/14/windbg-quickstart-guide-part-4-debugging-unexpected-program-behaviour.aspx