1. 程式人生 > >windbg學習記錄(一)

windbg學習記錄(一)

1、安裝

如果你安裝了WDK或vs的相關版本,你都可以從安裝目錄中找到它們(一般在Debuggers目錄中)。如果沒有,你可以從下面的連結去下載安裝:
Install Debugging Tools for Windows 32-bit Version
http://www.microsoft.com/whdc/devtools/debugging/installx86.mspx
Install Debugging Tools for Windows 64-bit Versions
http://www.microsoft.com/whdc/devtools/debugging/install64bit.mspx

2、簡單配置

符號檔案搜尋路徑配置(Symbol File Path)
D:\user_symbol_path;SRV*D:\symbolslocal*http://msdl.microsoft.com/download/symbols意思是先從D:\user_symbol_path中找符號檔案,如果沒找到,就去伺服器中下載並儲存到D:\symbolslocal目錄中。可以用.reload重新載入符號檔案

Image File Path配置
此項是在載入dump時,設定可執行檔案exe,dll的路徑的

Source File Path配置
設定原始碼目錄。如果當前指令指標在原始碼範圍內,就會自動跳出原始檔視窗。原始檔視窗中的操作和vs類似。如果沒有跳出,可以單機選單項Open Source File手動選擇原始檔

3、開始除錯

我們可以通過選單項Open Executable來載入本地的一個exe來進行除錯,也可以通過選單項Attache to a Process來載入一個已經執行的exe來進行除錯。
具體除錯指令可以參考:
Help->Contents->Debugging Tools for Windows->Debuggers->Debugger Reference

3、關於工作空間

windbg會儲存每個你除錯的工程的資訊,這些資訊包括除錯專案的屬性、引數、會話狀態、偵錯程式設定、及圖形介面資訊,類似於ide的專案檔案。
每個除錯的工作空間資訊預設儲存在
HKEY_CURRENT_USER\Software\Microsoft\Windbg\Workspaces

中,在這個鍵下一般有4個子鍵UserKernelDumpExplicit、他們分別儲存使用者態除錯,核心態除錯、轉儲檔案除錯、以及手動儲存(Save Workspace As)的工作空間資訊。

4、視窗介面介紹

名稱 熱鍵 用途
Command Atl+1 輸入命令、顯示命令結果和除錯資訊輸出
Watch Atl+2 觀察指令全域性變數、區域性變數和暫存器的資訊
Locals Atl+3 自動顯示當前函式的所有區域性變數
Registers Atl+4 觀察和修改暫存器的值
Memory Atl+5 觀察和修改記憶體資料
Call Stack Atl+6 棧中記錄的函式呼叫序列
Disassembly Atl+7 反彙編
Scratch Pad Atl+8 白板,可以用來做除錯筆記等
Processes and Threads Atl+9 顯示所有除錯目標的列表,包括程序和執行緒等
Command Browser Ctrl+N 執行和瀏覽命令

5、常用命令

windbg命令分為標準命令,元命令和擴充套件命令。
以.開頭的元命令提供標準命令沒有提供的功能,也內建在除錯引擎中。
以!開頭的擴充套件命令用於擴充套件某一方面的除錯功能,實現在動態載入的擴充套件模組中。

.reload 重新載入符號檔案
.restart 重新啟動除錯目標
bp $exentry 在程式入口點設定斷點,$exentry是一個偽暫存器
bp 0x00401030 在地址0x00401030處設定斷點
bp MyTestModule!MyTestFunc 在MyTestModule模組中的MyTestFunc函式處設定斷點,前提是該模組符號已經載入
bp MyTestModule!MyTestClass::SetValue 在模組MyTestModule的MyTestClass類成員函式SetValue處設定斷點
bp @@C++(MyTestModule!MyTestClass::SetValue) 與上面一樣,語法不同,C++語法,上面的為MASM語法
bl 檢視設定的斷點
be 啟用斷點
bd 禁用斷點
bc 刪除某個斷點
s –a 00400000 L53000 “Wrong” 以ASCII碼的形式從00400000處開始往後53000個位元組搜尋字串“Wrong”
ba 設定訪問斷點
ba r 1 0044108c 在記憶體0044108c的位置開始的下一個位元組的讀斷點
ba [email protected]@C++(&i) 給變數i地址下4個位元組的寫斷點
g 執行程式,相當於F5
gu 返回函式呼叫處,相當於shift+F11
a 修改當前指令,輸入修改的指令按Enter結束
u 檢視當前正要執行的程式碼
k 檢視當前呼叫堆疊
~ 檢視除錯程序中的執行緒資訊
db 400000 以二進位制的方式顯示記憶體地位為400000開始的內容
dd 400000 以DWORD型別檢視
d 按上一次的d命令的方式來顯示,如果不帶引數,則從上一次顯示結束的地方繼續顯示
?i 檢視區域性變數i的值,會以10進位制和16進位制同時顯示
eb 0012ff78 'a' 'b' 從記憶體地址0012ff78開始依次寫入後面的值
r 用於檢視或者修改暫存器或偽暫存器
r $peb $peb是一個偽暫存器,偵錯程式將它定義為當前程序的程序環境塊地址
dt 用於檢視結構體內容
!address 400000 檢視指定記憶體地址的資訊
dv 檢視當前作用域下區域性變數的型別和值

!analyze -v 詳細顯示當前異常資訊

6、常用除錯方法

6.1、附加程序除錯

  • 使用File選單中的Attach to a Process選項來選擇要附加除錯的程序

6.2、啟動除錯新程序

  • 法一:使用File選單中的Open Executable選項來選擇要啟動除錯的程序
  • 法二:啟動windbg時將待除錯的程式的檔案路徑作為引數傳遞給windbg
  • 法三:在登錄檔HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Image File Execution Options下新建一個以程式名命名的子項,然後在這個子項中新建一個名為DebuggerREG_SZ型別的值,將值設定為windbg的全路徑,比如C:\Program Files (x86)\Windows Kits\8.1\Debuggers\x86\windbg.exe。這樣,再執行待除錯的程式時,作業系統就會先啟動windbg,並把要除錯程式的路徑傳遞給他。

6.3、除錯轉儲檔案

  • 使用File選單中的Open Crash Dump選項來載入dump檔案

6.4、遠端除錯

注意:伺服器(被除錯程式的機器)和客戶端(發出遠端請求的機器)都應該安裝版本相同的windbg,應該有網路連線或者序列口連線。
以tcp埠方式:

  • 以命令列的方式啟動伺服器中的windbg,如:windbg.exe -server tcp:port=5005
  • 以命令列的方式啟動客戶端中的windbg,如:windbg.exe -remote tcp:port=5005,server=192.168.1.180,

以管道方式:

  • 以命令列的方式啟動伺服器中的windbg,如:windbg -server npipe:pipe=advdbg, adbdbg為命名管道名稱。
  • 在客戶端中以命令列的方式啟動windbg,如:windbg -remote npipe:server=REMOTEHOSTNAME,pipe=advdbg, REMOTEHOSTNAME為遠端主機名,dbvdbg為遠端主機建立的命名管道名。(也可以選擇File選單中的Connect to Remote Session,在彈出來的編輯框中輸入遠端引數npipe:server=REMOTEHOSTNAME,pipe=advdbg
  • 成功連線後,命令列資訊區會顯示類似如下資訊:
    ...(npipe advdbg) connected at Thu Jul 05 18:24:01 2017,
    之後可以在客戶端或者伺服器的windbg中執行各種除錯命令,執行結果會同時顯示在兩個偵錯程式中

還有其它的方式以及遠端除錯方案,具體可以參考
https://docs.microsoft.com/en-us/windows-hardware/drivers/debugger/remode-debugging-using-windbg

7、參考文章

http://www.cnblogs.com/kekec/archive/2012/12/02/2798020.html