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
User
、Kernel
、Dump
、Explicit
、他們分別儲存使用者態除錯,核心態除錯、轉儲檔案除錯、以及手動儲存(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
下新建一個以程式名命名的子項,然後在這個子項中新建一個名為Debugger
的REG_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