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