windbg除錯命令

whatday發表於2013-04-19

#重要說明

(1) windbg命令分為標準命令元命令擴充套件命令

     標準命令提供最基本的除錯功反能,不區分大小寫。如:bp  g  dt  dv  k等

     元命令提供標準命令沒有提供的功能,也內建在除錯引擎中,以.開頭。如.sympath  .reload等

     擴充套件命令用於擴充套件某一方面的除錯功能,實現在動態載入的擴充套件模組中,以!開頭。如!analyze等

(2) 進入除錯狀態時,直接回車可重複執行上一條命令;按上下方向鍵可以瀏覽和選擇以前輸入過的命令

(3) 神奇的Tab鍵,進行命令補全;ESC清除當前命令輸入框中的文字

(4) 使用;作為分隔符,可以在同一行輸入多條命令

(5) 上圖紅色框中的“0:000”。0當前除錯會話的程式號000除錯會話的執行緒號

(6) 當命令提示符顯示*BUSY*時,即使命令輸入框可以輸入命令,但輸入的命令不會立即被執行,要等windbg空閒時才能執行。

     可使用Ctrl + Break來終止一個長時間未完成的命令

(7)萬用字元 *代表0或任意多個字元,?代表任一個單一字元,#代表它前面的字元可以出現任意次,比如lo#p表示所有以l來開始p結束,中間有任意多個o的所有符號,比如lop,loop,looop... 如果中間允許多個字元重複,使用方括號,例如用 m[ai]#n 可以通配 man, min, maan,main,maiain等

#啟動除錯

windbg "notepad.exe" arguments  // 使用windbg啟動除錯notepad.exe

windbg -p 4200  // 將windbg附加到一個正在執行的pid為4200的程式上

windbg -pn "notepad.exe"  // 將windbg附加到一個正在執行的名為notepad.exe的程式上

windbg –z "c:\mydumpfile.dmp" // 除錯mydumpfile.dmp檔案

.attach 0n4220  // 4220為十進位制pid,使用該命令附加除錯時,必須先存在一個除錯會話

.detach   // 分離除錯

.restart  // 重啟並除錯

.kill  // 強制結束當前除錯

q  // 退出windbg

#獲取幫助

?   // 列印出所有標準命令

.help  // 列印出所有元命令

.hh  // 開啟windbg的chm幫助檔案

.hh bp  // 開啟windbg的chm幫助檔案bp命令介紹頁

command /?  // 列印命令command具體引數用法

#註釋符

*  // 註釋整行

$$ // 註釋(遇到分號結束)

#配置除錯環境

.sympath   // 檢視當前符號查詢路徑

.sympath c:\symbols   // 將符號查詢路徑設為:c:\symbols

.sympath+ c:\symbols  // 將c:\symbols新增到符號查詢路徑集合中

.symfix // 將符號查詢路徑設為:SRV*WinDbg安裝目錄\Sym*http://msdl.microsoft.com/download/symbols

.symfix f:\symbols // 將符號查詢路徑設為:SRV*f:\symbols*http://msdl.microsoft.com/download/symbols

.symfix+ f:\symbols  // 將SRV*f:\symbols*http://msdl.microsoft.com/download/symbols新增到符號查詢路徑集合中

.srcpath // 檢視當前原始檔查詢路徑

.srcpath f:\src // 將原始檔查詢路徑設為:f:\src

.srcpath+ f:\src  // 將f:\src新增到原始檔查詢路徑集合中

.exepath // 檢視可執行檔案查詢路徑

.exepath f:\bin // 將可執行檔案查詢路徑設為:f:\bin

.exepath+ f:\bin  // 將f:\bin新增到可執行檔案查詢路徑集合中

#符號載入與檢視

除了使用ld和.reload命令直接載入符號檔案,某些使用符號的命令也可以觸發偵錯程式來載入符號,如:棧回溯命令(k*)和反彙編命令(u)等。

值得說明的是,windbg預設使用的是懶惰式符號載入策略,當它收到模組載入事件時,它通常是不會載入符號的,符號狀態顯示為deferred(延遲載入)。

.symopt // 顯示當前所有符號選項

.symopt+ flags // 新增符號選項

.symopt- flags // 刪除符號選項

ld * // 為所有模組載入符號

ld kernel32 // 載入kernel32.dll的符號

.reload // 為所有模組載入符號資訊

.reload /f /v // f:強制立即模式  v:詳細模式

.reload /f @"c:\windows\System32\verifier.dll"// 為指定模組載入符號資訊

!sym noisy //開啟載入符號的“吵雜”模式

.reload /i dbgee.exe //載入不完全匹配的符號檔案 dbgee.exe的符號檔案

.chain  // 顯示已經載入進來的模組

x *! // 列出所有模組對應的符號資訊

lm // 列出所有模組對應的符號資訊

lm vm ker* // v 列出模組的詳細資訊 m為過濾模組 ker*萬用字元 ker開頭的所有模組

!lmi  // 列出一個模組的詳細資訊

ln 8053ca11 // 用來搜尋距離指定地址8053ca11最近的符號

x ConsoleTest!* // 列出ConsoleTest模組中的所有符號

x ConsoleTest!add* // 列出ConsoleTest模組中的所有add開頭的符號

x /t /v ConsoleTest!* // 帶資料型別、符號型別和大小資訊,列出ConsoleTest模組中的所有符號

x kernel32!*LoadLib* // 列出kernel32模組中所有含LoadLib字樣的符號

u  // 反編譯

u .u $ip       //兩個命令是效果是一樣的, 反彙編當前$ip地址上的8條命令.

uf .

uf $ip      //兩個命令的效果是一樣的, 反彙編當前$ip地址上的整個函式.

uf AllcStk!WinMain //反彙編AllcStk模組中的完整的WinMain函式。

ub .

ub $ip         //兩個命令的效果是一樣的反彙編$ip之前的8條指令.

ub $ip L2a  //反彙編$ip地址之前的42條指令.

u $ip $ip+a //反彙編地址$ip到地址$ip+10之間的指令. 注意, 這裡包括$ip, 不包括$ip+10。

#程式與執行緒

|   // 列出除錯程式

|*  // 列出除錯程式

|N  // 參看序數為N的除錯程式

|Ns // 切換序數為N的程式為當前除錯程式

||Ns//切換序數為N的系統為當前除錯系統

~   // 列出執行緒

~*  // 所有執行緒

~* k // 所有執行緒堆疊資訊

~* r // 所有執行緒暫存器資訊

~.  // 檢視當前執行緒

~# // 檢視導致當前事件或異常的執行緒

~N  // 檢視序數為N的執行緒

~~[n]  // 檢視執行緒ID為n的執行緒

~Ns   // 切換序數為N的執行緒為當前除錯執行緒

~N f  // 凍結序數為N的執行緒

~N u // 解凍序數為N的執行緒

~N n  // Suspend序數為N的執行緒

~N m // Resume序數為N的執行緒

.thread  //顯示或設定暫存器上下文所針對的執行緒. 得到當前執行緒的_ETHREAD 第一個結構是Tcb是_KTHREAD 從而得到該執行緒的核心棧地址 然後可用 dt nt!_KTHREAD "執行緒地址" 來檢視

#斷點

bl   // 列出所有斷點

bc * // 清除所有斷點

bc 1 // 清除1號斷點

bc 1 2 5  // 清除1號、2號、5號斷點

be *  // 啟用所有斷點

be 1  // 啟用1號斷點

be 1 2 5 // 啟用1號、2號、5號斷點

bd *  // 禁用所有斷點

bd 1  // 禁用1號斷點

bd 1 2 5 // 禁用1號、2號、5號斷點

bp 7c801b00  // 在7c801b00地址處放置一個斷點

bp `ConsoleTest.cpp:36`  // 在ConsoleTest.cpp的36行處放置一個斷點

bp main // 在main函式的起始處放置一個斷點

bp CSecondLoader::CSecondLoader  // 在CSecondLoader的建構函式處放置一個斷點

bp TestCommon! CTest::add  // 在TestCommon.dll的Test.cpp檔案的CTest::add()函式起始處放置一個斷點

bp `ConsoleTest.cpp:40` "j (poi(MyVar)>5) '''g'"// 條件斷點 MyVar>5,執行空語句;,斷住  否則繼續執行

bp `ConsoleTest.cpp:40` "j @eax = 0xa3 ''; 'g'"// 條件斷點 暫存器eax的值為0xa3時斷住

bu  // 儲存斷點,其用法和bp一樣 設定一個延遲的以後再落實的斷點,用於對尚未載入的模組中的程式碼設定斷點,當指定的模組被載入時,WinDBG會真正的落實這個斷點。

bm add_*  // 匹配add_開頭的函式,並在這些函式起始處都打上斷點

ba w4 0483dfe0 //記憶體斷點 當對0483dfe0地址寫操作時停下

                          // ba [r|w|e] [Size] Addr      [r=read/write, w=write, e=execute], Size=[1|2|4 bytes]

#除錯執行控制

g  // Go(F5)

gH // 執行gH命令強制讓偵錯程式返回已經處理了這個異常。【Go with Exception Handled

     // 系統收到這個回覆後會停止分發異常(因為偵錯程式聲稱已經處理了異常),恢復除錯目標繼續執行,

     //  但由於異常條件仍在,所以還會產生異常,於是再次分發,WinDBG再次中斷到命令模式。

gN // Go with Exception Not Handled

     // 執行gN命令強制讓偵錯程式返回沒有處理了這個異常,那麼系統會進一步分發該異常,

     // 如果沒有其他偵錯程式也不處理,最後系統會彈出程式終止對話方塊。

gu  // 執行到當前函式完成時停下 【Go Up

p    // 單步執行(F10)  【Step

p 2 // 2為步進數目

pc   // 執行到下一個函式呼叫處停下 【Step to  Next Call

pa 7c801b0b // 執行到7c801b0b地址處停下  【Step to Adress

t     // Step into(F11) 【Trace

tc    // 執行到下一個進入點處停下 【Trace to Next Call

ta 7c801b12  // 執行到7c801b12地址處停下 【Trace to Adress

# 檢視變數

dt nRet  // 檢視變數nRet的型別與值

dt -v -r _eprocess //r顯示成員中是子結構成員 v顯示詳細資訊

dv   // 顯示當前函式內所有區域性變數,函式引數

dv n*  // 顯示當前函式內n開頭的所有區域性變數,函式引數

dv /t /i /V /a|/n|/z

/***************************************** 

更加詳細地顯示當前函式內所有區域性變數,函式引數資訊
i = type (local, global, parameter)
t = data type
V = memory address or register location
-----------------------
a = sort by Addr, n = sort by name, z = sort by size

*****************************************/

#呼叫堆疊

k  // 顯示當前呼叫堆疊

kn // 帶棧編號顯示當前呼叫堆疊

kb  // 列印出前3個函式引數的當前呼叫堆疊

kb 5 // 只顯示最上的5層呼叫堆疊

.frame // 顯示當前棧幀

.frame n // 設定編號n的棧幀為當前棧幀

.frame /r n // 設定編號n的棧幀為當前棧幀 並顯示暫存器變數

!uniqstack // 顯示所有執行緒的呼叫堆疊

#暫存器

r // 顯示所有暫存器資訊

r eax, edx // 顯示eax,edx暫存器資訊

r eax=5, edx=6  // 對暫存器eax賦值為5,edx賦值為6

#記憶體

da /c 5 7c801e02  // 從7c801e02記憶體處開始,顯示5個ascii字元

/*****************************************

d[a| u| b| w| W| d| c| q| f| D] [/c 列數] [地址]

a = ascii chars
u = Unicode chars
b = byte + ascii
w = word (2b)
W = word (2b) + ascii
d = dword (4b)
c = dword (4b) + ascii
q = qword (8b)
f = floating point (single precision - 4b)
D = floating point (double precision - 8b)

*****************************************/

dyb /c 3 7c801e02  // 從7c801e02記憶體處開始,顯示3個byte及二進位制

/*****************************************

dy[b | d] ..   // b = binary+byte     d = binary+dword

*****************************************/

dd /c1 esp //以一列顯示堆疊資訊

#dump輸出

 .dump /ma "d:\mydmpfile.dmp" // 將當前除錯程式輸出Dump檔案

#其他元命令

.tlist  // 顯示所有程式

.cls  // 清除螢幕

.logopen /t c:\logs\mylogfile.txt  // 執行結果輸出到Log檔案

#其他擴充套件命令

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

!peb // 格式化輸出PEB資訊(process's environment block)

!gle  // 列印當前執行緒最近的錯誤資訊

!gle -all  // 列印所有執行緒的最近的錯誤資訊

!error  897// 顯示錯誤碼為897的詳細描述資訊

#幫助

中文線上幫助:http://www.dbgtech.net/windbghelp/index.html


相關文章