用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