絕殺!Debug 大法,讓運維不再尷尬
- Virtual Byte是整個程序佔用的全部虛擬地址空間。包含保留和提交的記憶體。32位Windows使用者模式下,程序預設最大可以使用2GB。在64位Windows下,程序的虛擬地址空間可以達到8TB。
- Committed bytes 是虛擬地址空間正在被使用的那部分。這部分空間可以保證程序的地址可以對映到實際的實體記憶體(及磁碟page分頁)上。
- Private Bytes是隻被本程序用佔用的虛擬地址空間,不包括其他程序共享的記憶體。
- Shared bytes 是與其他程序共享的一部分虛擬地址空間。
- Working Set是一個程序可以用到(但不一定會使用)的實體記憶體。即不引起page
- fault異常就能夠訪問的記憶體。Working Set包含了可能被其他程式共享的記憶體。
2.2 Debug除錯常用概念
2.2.1 Windows系統有時候會出現宕機及異常重啟的情況,可能的現象例如:
- 機器非常慢,多個應用程式異常的慢,無法進行操作。
- 滑鼠/鍵盤沒有響應。
- 網路沒有響應,PING/RDP/檔案共享失敗。
- 本地無法登入,桌面鎖死,黑灰屏或是隻有背景介面。
- 系統直接異常重啟。
- 系統藍屏。
出現上述情況的可能的原因:
- 硬體問題。
- 系統/應用程式死鎖。
- 核心資源使用異常。
- 病毒/惡意軟體。
2.2.2 除錯系統宕機/藍屏的基本思路,如下:
- 檢查系統日誌,看是否有出錯記錄。
- 開啟效能監控器,檢查系統資源使用。
- 檢查硬體。
- 解除安裝最近安裝的軟硬體。
- 用最後一次正常配置的模式恢復到之前的正常配置。
- 手動的收集宕機時的DUMP檔案。
- 收集系統藍屏時的DUMP檔案。
- 通過另一臺機器進行Live debug。
2.2.3 DUMP概念
在系統藍屏時,核心會嘗試把當前記憶體中的資料儲存下來,寫成Memory.dmp檔案,用於事後分析出錯原因。
DUMP檔案其實就是出錯一瞬間,系統記憶體中內容的一份備份。它是一份靜態的資料備份,並不是一個動態的一段時間內系統狀態的記錄。
2.2.4 DUMP檔案型別
- Complete Memory Dump 完全記憶體轉儲:系統藍屏時,記憶體中的所有資料,包括使用者態及核心態資料。該檔案較大,一般就是當時記憶體使用大小。
- ernel Memory Dump核心記憶體轉儲:系統藍屏時,記憶體中核心態的資料。一般只在完全記憶體轉儲檔案的1/3大小。
- Small Memory Dump (“Minidump”):包括最基本的除錯資訊,如loaded drivers、kernel-mode stack、出錯程式碼等。較小,64KB–256KB。
2.2.5 DUMP檔案除錯工具
除錯的配置及分析工具有很多,例如:
- Windbg:即可分析使用者態dump,也可以分析核心態dump
- gflags :Windbg中的gflag.exe,能夠很好地分析捕獲heap破壞異常問題。
- Adplus: 能夠互動式分析停止響應(掛起)或失敗(崩潰)的程序或應用程式的問題。
- debug diagnostic:可以自動分析使用者態dump檔案,但不能分析核心dump(如系統藍屏dump)。可以很好地分析定位記憶體洩露問題。
- visual studio: 只能分析使用者態dump
- perfmon:Windows系統預設自帶的效能分析工具。其實是很好很強大的。用得好不好,就看你對Windows瞭解有多深了。
- PAL:通過PAL分析perfmon的效能日誌檔案,可以自動產生一個網頁版的效能分析報告,大大方便了我們分析系統性能工作,是一款非常好用的效能分析輔助工具。
2.2.6 Windbg簡介
Windbg是常用而且強大的Windows除錯分析工具,介面如圖17-10所示。
Windows debugger安裝程式下載地址:
X86:
X64:
一般情況,我們使用Windbg工具進行DUMP除錯。
Windbg 也可以用於程式碼除錯及實時除錯。除了直接安裝Windbg,我們也可以把其它機器上安裝好的Windbg資料夾直接拷貝到另一臺機器上即可使用。
Windbg Symbol 檔案
在Windows 系統中,Symbol檔案以.pdb 為副檔名。
Symbol Files是一個數據信息檔案,它包含了應用程式二進位制檔案(比如EXE、DLL等)除錯資訊,專門用於除錯時解釋可執行檔案中的變數資訊。
WindowsPublic Symbol 地址:
Private Symbols 包含更多的資訊,如本地變數名、源程式行、變數型別等資訊。
有很多資訊在public symbol中是看不到的,但是這些資訊只限於作業系統核心,即使有private symbol,也需要配合source code一起分析。
Windbg中設定Symbol Path
設定Symbol的目的是告訴debugger哪裡去對應或下載相應的Symbol files。
設定Symbol時,可以包含多個路徑,包換Microsoft Symbol伺服器、本地Symbol路徑、內部Symbol檔案共享、程式開發時建立的Symbol等。這些路徑以“;”分隔。
Symbol path 示例如下:
WinDbg中四種方法設定symbol path
- Set the _NT_SYMBOL_PATH environment variable
- Use the -y command line option
- Use the .sympath (Set Symbol Path) debugger meta-command
- Use the “Symbol File Path” command in the File menu
Windbg基本使用方法
當開啟一個dump檔案,!analyze –v是唯一默認出現在Windbg中的命令。這個命令可以檢視關於此DUMP檔案的最基本的資訊,如下示例: