windbg設定條件斷點

2021-07-15 19:42:41 字數 1785 閱讀 1230

一直以為windbg的bp斷點只是簡單的在某個位址上下斷點,後來才發現bp斷點功能很強大:除了可以設定條件斷點還是windbg指令碼的基礎.

使用方法很簡單:bp address ".if(condition){};.else{}" 具體例子形如:

bp `4dbg.cpp:18` ".if(hfile>=0){};.else"
這裡是對原始檔中某一行下條件斷點,如果控制代碼值大於等於0則中斷偵錯程式,否則繼續往下執行。岔開一下對原始碼下斷點的方式為: bp `filename:linenumber` (首尾那模糊的兩點是波浪鍵那一點).

如果條件斷點中使用了別名(什麼是別名?點此鏈結) 需要注意一下兩點:

1.必須使用.block{}把使用別名的包含在裡面;

2.必須在使用別名前,先用ad命令把別名刪除掉;

下面用一段**示例條件斷點的用法:

int _tmain(int argc, _tchar* argv)

; handle hfile=createfile("c:\\a.txt",

generic_write|generic_read,

0,null,

open_always,

file_attribute_normal,

null);

if (hfile == invalid_handle_value)

for(int i=0;i<3;i++)

closehandle(hfile);

return 0;

}

我想在這段**中設定這樣兩個斷點:

1.createfile是否成功開啟檔案,即hfile是否大於0,若成功,則斷下,否則繼續執行(從return 0退出程式),這個斷點可以這樣設定:

bp `4dbg.cpp:12` ".if(hfile>=0){};.else"
2.想獲得呼叫writefile時,第二個引數的內容,並且如果傳入的字串和456匹配,則中斷偵錯程式執行,可以這麼寫(有點複雜):

bp kernel32!writefile "

r @$t1=poi(esp+8);

ad *;

as /ma $buf @$t1;

.block }

"

大概解釋一下:

poi(esp+8)是從棧變數中取值,將值作為位址返回給呼叫者,這裡是乙個臨時變數。

當程式執行call kernel32!writefile進入kernel32!writefileimplementation時,esp+8指向傳給函式的第二個引數:

4dbg!main+0xa3:

01251443 ff15ac812501 call dword ptr [4dbg!_imp__writefile (012581ac)] ds:0023:012581ac=

0:000> t

kernel32!writefileimplementation:

769a55a6 8bff mov edi,edi

0:000> dd esp+8

002bfa24 0125574c 00000003 002bfb30 00000000

0:000> da 0125574c

0125574c "123"

隨後,為字串的首位址(儲存在臨時變數t1)取乙個別名,並在block中進行字串匹配,匹配的結果存放在臨時變數t2中。最後比較t2的值

windbg條件斷點

條件斷點 condition breakpoint 的是指在上面3種基本斷點停下來後,執行一些自定義的判斷。在基本斷點命令後加上自定義除錯命令,可以讓偵錯程式在斷點觸發停下來後,執行偵錯程式命令。每個命令之間用分號分割。語法格式如 0 000 bpaddress j condition option...

windbg 除錯驅動設定斷點

在對windows的驅動做雙機除錯時,總會需要在自己編寫的驅動 上設定斷點。1 這需要首先,在windbg上設定工作空間 workspace 在這步裡面,需要將自己生成的符號檔案,能夠讓windbg搜尋到,即將自己符號檔案的路徑加入到windbg的symbol path裡 需要將自己編寫的原始檔,能...

windbg字串比較條件斷點

當暫存器指向字串為與某個字串相同時,斷下程式。問題關鍵 需要把暫存器指向的字串取出來比較,而別名可以做到這一點。測試原始碼 void main 斷點 1 e 0040141f e hello test2 test2.cpp 30 0001 0001 0 test2 main 0x3f 指令碼e sc...