在程式中設定讀 寫 執行的硬體斷點

2021-07-13 09:36:10 字數 2203 閱讀 1760

作者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很有用,裡面...