1. 程式人生 > >絕殺!Debug 大法,讓運維不再尷尬

絕殺!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等)除錯資訊,專門用於除錯時解釋可執行檔案中的變數資訊。

WindowsPublic 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檔案的最基本的資訊,如下示例: