Windbg调试
Windbg中文幫助手冊:http://www.dbgtech.net/windbghelp/
執行程序:
g (F5): ? 運行程序
p(F10): ? 單步步過執行
?? t? (F11/F8): 單步步入執行
?
斷點處理:
bl? 顯示斷點狀態
bp 斷點下在固定地址
bu 斷點下在符號上
ba 斷點下在內存上(當內存被操作時觸發)
be disable掉斷點
bc Breakpoints 清除斷點
其他的斷點操作包括:顯示斷點列表、禁止或恢復斷點、刪除斷點等。
bd:禁止斷點,d代表Disable。如bd 1,禁止斷點1。斷點被禁止后將不起作用,但亦未刪除。
be:恢復斷點,e代表Enable。恢復被禁止的斷點。如be 1恢復1號斷點。
bc:清除斷點,如:bc 1,清除斷點1;bc *,清除全部斷點。
br:序號管理,r代表ReNumber,即重新排序。如:br 2 0,將2號斷點重設為0號斷點。
?
內存處理:
!address? [地址]:查看指定地址處的內存屬性。
!address :查看所有內存區域的屬性。
d* (Display Memory) 命令顯示指定內存或范圍的內容。
e* (Enter Values) 命令在指定內存地址寫入數據。
?
d[類型] ?[地址范圍]
d代表Display,類型包括:字符、字符串、雙字等。具體來說,d*命令共有這幾種:d、 da、db、dc、dd、dD、df、dp、dq、du、dw、dW、dyb、dyd、ds、dS。解釋如下:
db 以byte查看地址
dd 以4字節查看
dq 以8字節查看
da 以字符串查看
e 【地址】【數據】
e{b|d|D|f|p|q|w}?Address?[Values]?
e{a|u|za|zu}?Address?"String"?
e?Address?[Values]
注釋
該命令存在以下這些形式。ed 和eD 命令的第二個字符區分大小寫。見下表:
| e | 輸入數據的格式和前一次e* 命令一樣。(如果上一次的e*命令是ea、eza、eu或ezu,則最后一個參數是String并且不能省略。) |
| ea | ASCII 字符串(不以NULL結尾)。 |
| eb | 字節值。 |
| ed | 雙字值(4字節)。 |
| eD | 雙精度浮點數(8字節)。 |
| ef | 單精度浮點數(4字節)。 |
| ep | 指針大小的值。該命令根據目標機的處理器架構是32位還是64位,可能分別等于ed 或eq。 |
| eq | 4字值(8字節)。 |
| eu | Unicode字符串(非NULL結尾)。 |
| ew | 字值(2字節)。 |
| eza | NULL結尾的ASCII字符串。 |
| ezu | NULL結尾的Unicode字符串。 |
?
其他的內存處理命令:
- m?(Move Memory) 命令將一個內存區域的內容移動到另一個。
- f (Fill Memory) 命令用一個模板寫入內存區域,并重復直到區域被填滿。
- c?(Compare Memory) 命令比較兩個內存區域的內容。
- s?(Search Memory) 在內存區域搜索指定的模板或搜索內存區域中的ASCII或Unicode字符。
- .holdmem?(Hold and Compare Memory) 命令將一個內存區域和另外一個比較
寄存器查看:
r? :顯示所有寄存器的值
r 【寄存器】 :顯示某一個寄存器的值
默認每執行一步代碼就會顯示寄存器的值,在指令后面加r時候是指不顯示寄存器的值:
pr????????????執行一行源碼,并將寄存器切換為不顯示
查看調用堆棧:
使用下面一些方法顯示調用堆棧:
k?(Display Stack Backtrace) 命令是基本的堆棧追蹤命令。該命令顯示棧幀的基指針、返回地址和函數名。如果有源碼行號信息,k命令還會顯示源碼模塊和行號。
kb?(Display Stack Backtrace) 命令和k命令一樣顯示堆棧,并且顯示傳遞給函數的前三個參數。
kp?(Display Stack Backtrace) 命令和kb命令一樣顯示堆棧,并且顯示傳遞給函數的完整參數列表。
kv?(Display Stack Backtrace) 命令和kb一樣顯示堆棧,并且再顯示幀指針省略信息(FPO)。在基于x86的處理器上,該命令還顯示調用約定的信息。在基于Itanium的處理器上,該命令顯示非易失性寄存器。
kd?(Display Stack Backtrace) 命令顯示原始堆棧信息,不按照任何格式。
?
匯編模式的調試:
反匯編指令:
- u?(Unassemble) 命令反匯編并顯示一段機器碼。
- uf?(Unassemble Function) 命令反匯編并顯示一個函數。
- up?(Unassemble from Physical Memory) 命令反匯編并顯示保存在物理內存中的一段機器碼。
- ur?(Unassemble Real Mode BIOS) 命令反匯編并顯示指定的16位實模式代碼。
- ux?(Unassemble x86 BIOS) 命令反匯編并顯示指定地址處的x86 BIOS代碼指令。
- (僅WinDbg) 反匯編窗口反匯編并顯示指定節的機器碼。如果在Window 菜單中選擇了Automatically Open Disassembly,該窗口會自動激活。也可以通過點擊View 菜單的Disassembly 、按下ALT+7或點擊工具欄上的Disassembly window 按鈕()。
個人常用:
查看堆命令:
!heap
!heap -a
!heap也有一些很好用的命令
!heap?-stat?顯示進程中所有堆的信息,通過這個命令可以找到堆噴分配內存塊所屬的堆
!heap?-a?HEAP_HANDLE?顯示指定句柄的堆的情況
!heap?-stat?-h?HEAP_HANDLE?可以看到堆中塊的分布情況
!heap?-flt?s?size?顯示所有指定大小的塊
!heap?-p?-a?堆分配記錄
?
r 查看地址和寄存器
k 查看棧空間
u 查看指令
lmi 查看加載的模塊
ln 查看當前地址所在符號
s -a 搜索字符串
s -d 搜dword
s -
g -> go 繼續執行
?
F10 (p) 逐過程單步
F8?? 繼續單步跟入
F5?? (g)繼續執行
F9
!address 擴展命令可以顯示指定的內存地址的信息
dv? 命令可以查看當前作用域下局部變量的類型和值
.reload命令重新加載模塊的符號信息
kv 可以查看函數異常的函數調用棧?
kn 命令查看棧貞的編號?
uf 命令反匯編
dv 命令顯示當前作用域的所有局部變量的名字和值。
.hh 用來在Windbg中打開幫助文檔,比如使用.hh k則幫助文檔會打開到索引k命令處。
poi 操作符是WinDBG中可以被用來對指針進行解引用。類似C語言中對指針的操作符*
?
.attach 0n4220 // 4220為十進制pid,使用該命令附加調試時,必須先存在一個調試會話
.detach // 分離調試
.restart // 重啟并調試
.kill // 強制結束當前調試
q // 退出windbg
?
掌握有這些基本的調試指令,基本上可以調試一般的程序了,如果需要使用更多的功能需要查看windbg的幫助文檔來提升調試。后面我也會在調試和使用的過程中加以總結和完善。
1、poi指令:Poi操作符在WinDBG中可以被用來對指針進行解引用. 類似C語言中對指針的操作符*.?
例如:0×00123456?? 中存放的是:0×00420000
0×00420000? 中存放的是:1234
dd poi(0×00123456) 顯示的就是1234
2、 查看多個地址數據:dd 起始地址 目標地址:
dd 7ffd5000??? 7ffd5000 +128
?3、ba?Access?Size?[地址] Access 是訪問的方式, 比如?e?(執行),?r?(讀/寫),?w?(寫)
?? Size?是監控訪問的位置的大小,以字節為單位。 值為 1、2或4,還可以是 8(64位機)。
比如要對內存0x0483DFE進行寫操作的時候下斷點,可以用命令?ba w4 0x0483DFE。
?
轉載于:https://www.cnblogs.com/Yable/p/8633511.html
總結
- 上一篇: 多线程之线程池-各个参数的含义- 阿里,
- 下一篇: python练习--模拟grep -B功