作者michael chourdakis, 翻譯binhua liu
簡介
1,visual c++只支援硬體寫斷點,而你可能需要在資料讀取時觸發斷點。
2,或許你用的不是visual c++,而你的偵錯程式使用的是一些速度很慢的基於軟體的斷點機制。
3,你可能希望能程式中設定和移除斷點。
4,或許你對cpu的底層機制感興趣。
特性
支援x86和x64平台
支援為每個執行緒設定4個硬體斷點
除錯暫存器
x86/x64包括一組除錯暫存器:dr0,dr1,dr2,dr3,dr6和dr7. 這些暫存器在32位模式下為32-bit, 64位模式下為64-bit. 其中dr0,dr1,dr2和dr3包含斷點的線性位址, dr7包含的位解釋如下:位功能
0-74個除錯暫存器的標誌位(每2個位對應乙個暫存器).第乙個標誌位指定是否是乙個本地斷點(local breakpoint)(cpu在切換任務時重設該標誌位),第二個標誌位指定是否是乙個全域性斷點(global breakpoint).在windows平台,你只能使用第乙個標誌位(雖然我沒有試過第二個).
16-23
每2個位對應乙個暫存器,用來定義斷點合適被觸發:
00b - **執行時觸發
01b - 資料寫入時觸發
10b - 保留
11b - 資料讀寫時觸發
24-31
每2個位對應乙個暫存器,定義斷點的大小
00b - 1位元組
01b - 2位元組
10b - 8位元組
11b - 4位元組
我們使用setthreadcontext來為執行緒設定斷點. 之後,一旦斷點被觸發, 將產生乙個單步異常exception_single_step.
設定斷點
見附件中的源**:
handle sethardwarebreakpoint(handle hthread,hwbrk_type type,hwbrk_size size,void* s);
hthread
- 被設定斷點的執行緒的控制代碼
type - 斷點型別:
- hwbrk_type_code
- hwbrk_type_readwrite
- hwbrk_type_write
size - 斷點的大小(size)
- hwbrk_size_1
- hwbrk_size_2
- hwbrk_size_4
- hwbrk_size_8
addr - 設定斷點的位址
該函式返回斷點的控制代碼, 在 removehardwarebreakpoint中被使用. 如果返回的是0,則表示
1,你不能訪問這個執行緒
2,你已經在這個執行緒上設定了最大數量的斷點(4個)
移除斷點
bool removehardwarebreakpoint(handle hbrk);
移除斷點,如果成功,返回true
例子
int __stdcall winmain(hinstance,hinstance,lpstr,int)
; lstrcpya(c1,"hello 1");
handle hx1 = 0;
hx1 = sethardwarebreakpoint(getcurrentthread(),
hwbrk_type_readwrite,hwbrk_size_4,c1);
__try
__except(getexceptioncode() == status_single_step)
removehardwarebreakpoint(hx1);
return 0;
}
歷史
本文寫於2008/7/24
作者 michael chourdakis .
在程式中設定讀 寫 執行的硬體斷點
作者michael chourdakis,翻譯binhua liu 簡介 1,visual c 只支援硬體寫斷點,而你可能需要在資料讀取時觸發斷點。2,或許你用的不是visual c 而你的偵錯程式使用的是一些速度很慢的基於軟體的斷點機制。3,你可能希望能程式中設定和移除斷點。4,或許你對cpu的底...
在WinDBG中設定斷點的命令
命令 0 bp 02sample kbtest fibonacci stdcall r esp 在零號執行緒上的kbtest類的fibonacci stdcall函式上設定斷點,並且在觸發斷點時執行 r esp 命令.bl 列出所有已經設定了的斷點 bc 清除所有斷點 bp 02sample kbt...
在FP中如何設定條件斷點
貌似很多書上沒講,很多人也不會,我在這裡講一下。調出breakpoint list 在debug選單裡面 你可以看到你現在設的所有斷點的列表。選乙個來edit或者new乙個,你可以看到如圖的視窗。裡面的name是檔名 pas line是表示斷點設在程式 的第幾行。ignore count很有用,裡面...