我常用的Windbg命令


用Windbg也有些時間了, 很喜歡這個強大的調試器, 不僅調試驅動爽, 調試應用程序也很爽. 命令有點多, 但經常用到的也是少數, 將自己經常用到的留存在這里, 以后用的時候, 難得去翻.

1 下斷點: bp, bm, ba, bl, bd, be

bp 普通下斷點, 可以下在符號上, 也可下在地址上

bm 可以一次下很多斷點, 支持通配符匹配, 例如, bm ga*, 能夠下在所有ga開頭的函數上.

ba 下在內存上, 當需要檢視某塊內存的讀寫或者執行時, 用這個命令. 格式一般如下: ba r4 8504160c, 從8504160c的內存, 當有讀時, break

bl和bd, be就不用說了

br 從新分配斷點id br 13 8

// 下條件斷點. article_name: Setting a Conditional Breakpoint

bp `sufilter.c:143` ".if (poi(MyVar)>5) {.echo MyVar Too Big} .else {.echo MyVar Acceptable; gc} "

2 ln

查看某個地址附近的情況, 例如, 需要了解某段地址附近有哪些代碼, 可用這個命令.

3 x

查看module在內存中的地址.

x *! 查看所有模塊在內存中的地址范圍

x sufilter! 查看sufilter所有的代碼符號(全局變量, 函數)的加載地址

x sufilter!sufilterreadwritemt

4 !analyze -v

分析dump信息, 包括被斷下來的藍屏

5 .crash

強制目標機器crash, 這對有時候需要帶走dump信息應該好使

要dump目標機器的信息, 使用.dump命令. .dump c:\xxxxx.dmp

分析, kd(windbg) -z xxxxx.dmp. .dump /f dump full信息. 默認dump為minidump

6 .reboot

強制目標機器重新啟動.

7 設置Windbg啟動參數, 通常將其設置在快捷方式里

"C:\Program Files\Debugging Tools for Windows (x86)\windbg.exe" -b -v -i D:\PROJECTS\Founder\fastrest\FastDisk\objchk_w2k_x86\i386 -y D:\PROJECTS\Founder\fastrest\FastDisk\objchk_w2k_x86\i386 -srcpath D:\PROJECTS\Founder\fastrest\FastDisk -k

-b - 參數, 1 debugger啟動后, 立即斷下目標機器. 2 機器重新啟動后, 內核一旦初始化, 就立即被斷下來.

-k - 參數, 用來指示連接參數. 參見windbg幫助.windbg ... -k com:port=ComPort,baud=BaudRate

-v - Enables verbose output from debugger.

-i - 指示ImagePath

-y - 指示symbolpath

-z - DumpFile. 分析dump文件時用.

-srcpath - 指示源文件path

8 查看堆棧 - k, 一般用kb, 其他參數參見幫組

childebp, retadd, argument func_addr

childebp - 該函數的堆棧, ebp起始地址, 局部變量, 參數, 都是通過ebp來訪問的. 所以, 了解ebp的地址是非常重要的

retadd - 返回地址, 可以通過返回地址ln retadd, 知道是那個函數call進來的.

argument - 不用說了. 進參是ebp+8開始的

dd ebp時, 看到的第一個dword是保存的父調用函數的ebp, 第二個dword是返回地址, 然后就是參數了.

dd ebp-x, 是本函數堆棧, 編譯時, 如果有cod生成, 可以看到local variable在堆棧中的位置, ebp-4, ebp-8, ebp-c等等.

kv 顯示Displays frame pointer omission (FPO) information. 這個Frame pointer, 我暫時的理解為堆棧或者Trap的框架指針.

當要用.trap命令查看trap frame時,先運行kv命令. 會看到諸如:a815e874 8052c409 badb0d00 e3051000 00000000 nt!KiTrap0E+0x238 (FPO: [0,0] TrapFrame @ a815e874)的樣式. 然后, 運行.trap a815e874. 查看trap frame

9 r 顯示寄存器

r eip=a9876045 修改寄存器的值.

10 !chkimg

查看在debug過程中, 手動修改過哪些地方.

!chkimg -v -f 查看module是否在調試過程中被修改過. -v - 詳細信息 -f - 修復.

11 lm

顯示加載的module

lmvm module 就是lm帶v和m選項. 列出module的詳情. m用來指定通配符. 如lmvm s*

12 t

t有很多子命令, 運行到分支tb, 運行到下一個call, tc, 運行到下一個return, tt等等

13 u

u也有很多子命令. 其中, ur(realmode bios)和ux(x86 bios)反匯編bios相關的代碼.

14 dt

查看類型, dt -b 顯示全部類型,包括子類型.

顯示數組.dt -a array

顯示子域. 如struct _st {int v1; int v2[10];} 要顯示b的內容. dt (_st)st_var -a v2

15 剛開始使用時, 經常讓我莫名奇妙的問題:

關於源代碼下不了斷點, 有可能有如下原因:

源代碼不是最新的, 源代碼的版本與符號文件的版本不一致.

注意, 經常用.reload來重新加載Symbol文件. 這是用windbg很容易犯的一個錯誤, 莫名奇妙的不知道怎么搞的, 就發現不對勁了.

源代碼的某段被宏注釋后, 可能下不了斷點.

16 值得看的幫助主題

//////////

Debugging a Stack Overflow

// 下條件斷點

Setting a Conditional Breakpoint

// 實時下載更新Symbols

Microsoft Public Symbols


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM