WinDBG 提供了多種設(shè)斷點(diǎn)的命令:bp, bu, bm, ba
bp 命令是在某個(gè)地址下斷點(diǎn), 可以 bp 0x7783FEB 也可以 bp MyApp!SomeFunction 。 對(duì)于后者,WinDBG 會(huì)自動(dòng)找到MyApp!SomeFunction 對(duì)應(yīng)的地址并設(shè)置斷點(diǎn)。 但是使用bp的問(wèn)題在于:1)當(dāng)代碼修改之后,函數(shù)地址改變,該斷點(diǎn)仍然保持在相同位置,不一定繼續(xù)有效; 2)WinDBG 不會(huì)把bp斷點(diǎn)保存工作空間中 。 所以,我比較喜歡用bu 命令。
bu 命令是針對(duì)某個(gè)符號(hào)下斷點(diǎn)。 比如 bu MyApp!SomeFunction 。 在代碼被修改之后, 該斷點(diǎn)可以隨著函數(shù)地址改變而自動(dòng)更新到最新位置。 而且bu 斷點(diǎn)會(huì)保存在WinDbg工作空間中, 下次啟動(dòng) Windbg 的時(shí)候該斷點(diǎn)會(huì)自動(dòng)設(shè)置上去。
另外,在模塊沒(méi)有被加載的時(shí)候,bp 斷點(diǎn)會(huì)失敗(因?yàn)楹瘮?shù)地址不存在),而bu 斷點(diǎn)則可以成功。 新版的WinDBG中 bp失敗后會(huì)自動(dòng)被轉(zhuǎn)成bu 。
bm 命令也是針對(duì)符號(hào)下斷點(diǎn)。 但是它支持匹配表達(dá)式。 很多時(shí)候你下好幾個(gè)斷點(diǎn)。 比如,把MyClass 所有的成員函數(shù)都下斷點(diǎn): bu MyApp!MyClass::* , 或者把所有以CreateWindow開(kāi)頭的函數(shù)都下斷點(diǎn): bu user32!CreateWindow* 。
以上三個(gè)命令是對(duì)代碼下斷點(diǎn), 我們還可以對(duì)數(shù)據(jù)下斷點(diǎn)。
ba 命令就是針對(duì)數(shù)據(jù)下斷點(diǎn)的命令, 該斷點(diǎn)在指定內(nèi)存被訪問(wèn)時(shí)觸發(fā)。 命令格式為
ba Access Size [地址]
Access 是訪問(wèn)的方式, 比如 e (執(zhí)行), r (讀/寫(xiě)), w (寫(xiě))
Size 是監(jiān)控訪問(wèn)的位置的大小,以字節(jié)為單位。 值為 1、2或4,還可以是 8(64位機(jī))。
比如要對(duì)內(nèi)存0x0483DFE進(jìn)行寫(xiě)操作的時(shí)候下斷點(diǎn),可以用命令 ba w4 0x0483DFE
這里順便提以下其他斷點(diǎn)命令:
bl 列出所有斷點(diǎn)
bc 清除斷點(diǎn)
bd 禁用斷點(diǎn)
be 啟動(dòng)被bd 命令經(jīng)用的斷點(diǎn)