WinDbg是微軟開發(fā)的免費源碼級調(diào)試工具。Windbg可以用于Kernel模式調(diào)試和用戶模式調(diào)試,還可以調(diào)試Dump文件。在DotNet方面WinDbg是調(diào)試分析SSCLI的最佳工具,同時可以和SOS擴(kuò)展一起調(diào)試分析.net程序。最近一段時間項目需要學(xué)習(xí)了一下,有感于WinDbg功能的強(qiáng)大。
WinDbg資料整理:
使用WinDbg調(diào)試程序
WINDOWS調(diào)試工具很強(qiáng)大,但是學(xué)習(xí)使用它們并不容易。特別對于驅(qū)動開發(fā)者使用的WinDbg和KD這兩個內(nèi)核調(diào)試器(CDB和NTSD是用戶態(tài)調(diào)試器)。本教程的目標(biāo)是給予一個已經(jīng)有其他調(diào)試工具使用經(jīng)驗的開發(fā)者足夠信息,使其能通過參考WINDOWS調(diào)試工具的幫助文件進(jìn)行內(nèi)核調(diào)試。本文將假定開發(fā)者熟悉一般WINDOWS操作系統(tǒng)和進(jìn)程的建立過程。
本文的重點是集成內(nèi)核模式和用戶態(tài)模式的圖形化調(diào)試器WinDbg。KD在腳本和自動化調(diào)試中更有用,并且在資深程序員中擁有一定地位,但是本教程將集中討論WinDbg,只會偶爾提到KD。
本文討論的是Windows NT 4.0,Windows 2000或以后的版本,而且目標(biāo)電腦的處理器基于X86架構(gòu)。對于64位平臺,將不會特別提及。
總之,本教程由簡單介紹調(diào)試器的安裝開始,大體分成2部分,基礎(chǔ)知識和選擇技術(shù)�;A(chǔ)知識包括基本調(diào)試命令和常用調(diào)試命令。選擇技術(shù)是其他命令和在很多情況下都有用的調(diào)查方法。后者并不是調(diào)查象deadlocks, memory corruption或者resource leaks的唯一方法。第一次閱讀本教程,你可能會跳過選擇技術(shù)。你可以停止閱讀本教程而轉(zhuǎn)向微軟調(diào)試器討論組,也可以通過調(diào)試器的反饋e-mai解決更多的問題。
通往WinDbg的捷徑(一)
通往WinDbg的捷徑(二)
用WinDbg探索CLR世界1 - 安裝與環(huán)境配置
在托管代碼中設(shè)置斷點(WINDBG)
用WinDbg動態(tài)脫Reflector
使用WINDBG和SOS調(diào)試死鎖
使用Windbg和SoS擴(kuò)展調(diào)試分析
幾個常用的 WinDbg 命令
Windbg核心調(diào)試之dump分析
從Ollydbg說起-----WinDbg用戶態(tài)調(diào)試教程
WinDbg使用幫助:基本調(diào)試技術(shù):
本節(jié)包括:
使用 !analyze 擴(kuò)展
設(shè)定條件斷點
將虛擬地址轉(zhuǎn)換成物理地址
追蹤處理器獨占者
從轉(zhuǎn)儲文件中提取信息
確定對象的ACL
顯示一個臨界區(qū)
調(diào)試應(yīng)用故障
SOS 調(diào)試擴(kuò)展 (SOS.dll)
WinDbg驅(qū)動調(diào)試攻略:
安裝完虛擬機(jī)后,請在VMware主菜單“VM”中選擇“Install VM Tools…”,完成系統(tǒng)驅(qū)動文件的安裝。
安裝完這兩個軟件后,請在VMware中安裝跟你的電腦版本相同的操作系統(tǒng)。例如:你的電腦安裝的是WindowsXP Professional,那么最好在Vmware中安裝相同版本。至少是相同的系統(tǒng),Windows XPßà Windows XP、Windows 2000ßà Windows 2000。這樣會在驅(qū)動調(diào)試過程中避免不必要的麻煩。筆者使用的操作系統(tǒng)為Windows XP Professional。
我們將使用電腦的COM1口最為調(diào)試口。
(1) 編輯虛擬機(jī)中C盤根目錄下的boot.ini文件。
C:\>attrib -s -h -r boot.ini
C:\>notepad boot.ini
在boot.ini文件中添加以下代碼:
multi(0) disk(0) rdisk(0) partition(1) \WINDOWS="Microsoft Windows XP Professional-Debug" /fastdetect /debugport=COM1 /baudrate=115200
(2) 打開vmware中winxp的設(shè)備管理器,選擇端口(com1),如下圖。
(3) 雙擊這個"com1",在彈出的對話框中,設(shè)置如下圖。
(4) 關(guān)閉vmware下的操作系統(tǒng)。配制虛擬機(jī)的硬件,VM->Settings->Add->加一個Serial Port,選擇"Output to named pipe",然后下一步,第一框里保持默認(rèn)的 "\\.\pipe\com_1"
第二框里選"This end is the server."
第三框里選"The other end is an application."
選中 "Connect at power on"選中 "Yield CPU on poll"。保存退出。
(5) 回到我們的真實系統(tǒng)(主機(jī))中,重復(fù)(2)、(3)兩步。
(6) 設(shè)置WinDbg的快捷方式,及其運行參數(shù):
在快捷方式的屬性中,將目標(biāo)(Target)改為:
"C:\Program Files\Debugging Tools for Windows\windbg.exe" -b -k com:pipe,port=\\.\pipe\com_1,resets=0
命令參數(shù)的意義:
-b:一旦主機(jī)目標(biāo)機(jī)之間建立起連接,立刻中斷目標(biāo)機(jī)
-k:內(nèi)核調(diào)試
Com:設(shè)置連接目標(biāo)機(jī)的通信端口(此處為命名管道)和波特率(此處為115200)
-y:設(shè)置符號文件路徑
(7)設(shè)置WinDbg參數(shù)
現(xiàn)在我們假設(shè)你的驅(qū)動代碼放在D:\mydriver目錄中;系統(tǒng)級Symbol文件存放在C:\WINDOWS\Symbols目錄中,這些Symbol文件是從微軟的網(wǎng)站上http://msdl.microsoft.com/download/symbols下載而來,這個網(wǎng)址是不可以用IE直接打開的,WinDbgà Fileà Symbol File Path...界面中選擇Reload,WinDbg會自動幫你下載;驅(qū)動生成的Symbol文件存放在D:\mydriver\objchk_wxp_x86\i386目錄中。
a) 設(shè)置驅(qū)動Symbol路徑,WinDbgà Fileà Symbol File Path...為
SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols; D:\mydriver\objchk_wxp_x86\i386
b) 設(shè)置驅(qū)動源文件路徑,WinDbgà Fileà Source File Path…為D:\mydriver
c) 為了保險起見,我們同時設(shè)置系統(tǒng)變量。
My Computer à Properties à Advanced Tab à Enviroment Variables à Add.
_NT_DEBUG_BAUD_RATE=115200
_NT_SYMBOL_PATH=SRV*C:\WINDOWS\Symbols*http://msdl.microsoft.com/download/symbols
_NT_ALT_SYMBOL_PATH = D:\mydriver\objchk_wxp_x86\i386
_NT_SOURCE_PATH = D:\mydriver
(8)啟動VMware,將主機(jī)目錄C:\WINDOWS\Symbols下的拷貝到虛擬機(jī)的相同位置。同時請把驅(qū)動編譯后生成在D:\mydriver\objchk_wxp_x86\i386目錄下的*.pdb、*.sys、*.map、*.exp、*.lib文件一并拷貝到兩個系統(tǒng)的C:\WINDOWS\Symbols目錄中。
(9)重新啟動VMware,并選擇如圖所示。這個時候先不敲回車鍵。
(10) 在主機(jī)中運行之前設(shè)置好的WinDbg快捷方式。直到在WinDbg命令窗口中出現(xiàn)“Waiting to reconnect...”,此時打開VMware,敲回車鍵進(jìn)入虛擬機(jī)。到這里所有的設(shè)置工作就全部完成了。
2.驅(qū)動安裝及調(diào)試
這里其大家注意,由于我們目前用的是虛擬機(jī),所以安裝驅(qū)動程序的時候一定要把VMware設(shè)置到全屏狀態(tài)。
(1) 編輯你要調(diào)試的源代碼,在你需要調(diào)試的代碼中添加硬斷點。如果不添加硬斷點,將沒有辦法進(jìn)入所調(diào)試的程序中。具體方法如下:
在你需要調(diào)試的程序中加入以下代碼:
extern "C" {
#include <wdm.h>
//或者是#include <winddk.h>
}//放在文件開頭
DbgBreakPoint();//放在需要調(diào)試的地方
重新編譯驅(qū)動程序,記住一定要更新把重新生成的*.pdb、*.sys、*.map、*.exp、*.lib文件一并拷貝到兩個系統(tǒng)的C:\WINDOWS\Symbols目錄中。
(2)打開VMware,Ctrl+Alt+Enter進(jìn)入虛擬機(jī)全屏模式。插入需要調(diào)試設(shè)備的硬件,筆者調(diào)試的目標(biāo)設(shè)備為USB。當(dāng)USB插入主機(jī)后,直接由VMware識別到這個USB設(shè)備,指定驅(qū)動位置,系統(tǒng)將會在你設(shè)置硬斷點的地方停下來。這個時候你就可以回到WinDbg,進(jìn)行單步調(diào)試了。你還可以在程序中添加軟斷點,“F9”或者“bp MyApp!MyFunction”。
3.兩臺電腦調(diào)試說明
兩臺電腦調(diào)試跟借助VMware調(diào)試有所不同,不同之處有以下幾個方面。
(1)需要自己制作一條Null Modem Cable. 請參考以下電路。將兩臺電腦連接起來。
管腳信息說明:
9-Pin NULL Modem Cabling
3 2 Transmit Data
2 3 Receive Data
7 8 Request to Send
8 7 Clear to Send
6,1 4 Data Set Ready and Carrier Detect
5 5 Signal Ground
4 6,1 Data Terminal Ready
25-Pin NULL Modem Cabling
2 3 Transmit Data
3 2 Receive Data
4 5 Request to Send
5 4 Clear to Send
6 20 Data Set Ready and Carrier Detect
7 7 Signal Ground
20 6 Data Terminal Ready
(2)WinDbg快捷方式參數(shù)設(shè)置
"C:\Program Files\Debugging Tools for Windows\windbg.exe" -b -k com:port=\\.\ com1,resets=0