windbg調試命令

 #調試命令窗口

 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

#重要說明

(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來終止一個長時間未完成的命令

#啓動調試

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 /i // 重新加載不匹配符號的模塊

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

.reload /f @"c:\windows\System32\verifier.dll" // 爲指定模塊加載符號信息

.chain  // 顯示已經加載進來的模塊

x *! // 列出所有模塊對應的符號信息

lm // 列出所有模塊對應的符號信息

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

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

x /t /v ConsoleTest!* // 帶數據類型、符號類型和大小信息,列出ConsoleTest模塊中的所有符號

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

u  // 反編譯

#進程與線程

|   // 列出調試進程

|*  // 列出調試進程

|N  // 參看序數爲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的線程

#斷點

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一樣

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的類型與值

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個函數參數的當前調用堆棧

 

02a9ffec 00000000 01e511f9 0174c570 00000000 kernel32!BaseThreadStart+0x37
----------------------------------------------
kernel32!BaseThreadStart+0x37 這個是函數地址。
01e511f9 0174c570 00000000 這是前三個參數。
02a9ffec 00000000是 ebp 和 返回地址。

 

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

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

#dump輸出

 .dump /ma "d:\mydmpfile.dmp" // 將當前調試進程輸出Dump文件

#其他元命令

.tlist  // 顯示所有進程

.cls  // 清除屏幕

#其他擴展命令

!analyze -v  // 詳細顯示當前異常信息

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

!gle  // 打印當前線程最近的錯誤信息

!gle -all  // 打印所有線程的最近的錯誤信息

!error  897// 顯示錯誤碼爲897的詳細描述信息

#幫助

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

windbg cmd: http://www.slideshare.net/kewuc/windbg-cmds 【下載

發佈了49 篇原創文章 · 獲贊 49 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章