一直以為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指向傳給函式的第二個引數:
隨後,為字串的首位址(儲存在臨時變數t1)取乙個別名,並在block中進行字串匹配,匹配的結果存放在臨時變數t2中。最後比較t2的值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"
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...