控制斷點旗標和參數
有許多方法可用來判斷斷點的基本資訊:
GetId 會傳回斷點標識碼。
GetType 會傳回斷點類型(軟體或處理器),以及設定斷點的有效處理器類型。
GetAdder 會傳回新增斷點的用戶端。
GetOffset 會傳回斷點的位址。
GetOffsetExpression 會傳回指定斷點位置的表達式字串。
除了其位置和斷點類型之外,斷點還有數個參數可控制其行為。
斷點參數可以透過各種特定方法來控制。 此外,大部分的參數都可以使用 GetParameters來查詢。
斷點旗標
斷點旗標是一種斷點參數。
您可以使用 GetFlags來查詢斷點標記。 您可以使用 AddFlags、RemoveFlags或 SetFlags來變更它們。
斷點旗標形成位元欄位。 可用於此位域中的可能旗標及其意義如下:
DEBUG_BREAKPOINT_ENABLED
當設定此旗標時,斷點 會被啟用,並發揮其正常效果。 未設定此旗標時,斷點會 停用,而且不會有任何作用。 如果您想要暫時停用斷點,您可以移除此旗標;當您想要重新啟用此斷點時,將這個旗標加回很容易。
DEBUG_BREAKPOINT_ADDER_ONLY
設定此旗標時,斷點是 私人斷點。 新增此斷點的用戶端才看得到該斷點。 在此情況下,其他用戶端將無法查詢引擎中的斷點,而且引擎不會將斷點所產生的事件傳送給其他用戶端。 與此斷點相關的所有回呼(事件和 輸出)只會傳送至此用戶端。 請參閱 GetAdder。
DEBUG_BREAKPOINT_GO_ONLY
設定此旗標時,只有在目標處於不受限制的執行中時,才會觸發斷點。 如果引擎正在逐步執行目標對象中的指令,則不會觸發該操作。
Debug Breakpoint 單次觸發
設定此標誌時,斷點會在第一次觸發時自動移除。
DEBUG_BREAKPOINT_DEFERRED
設定此旗標後,斷點會延遲。 當使用符號表示式指定斷點位移時,引擎會設定此旗標,而且引擎無法評估表達式。 每次在目標中載入或卸載模組時,引擎會嘗試為每個使用表達式指定位置的斷點重新評估表達式。 無法評估的會被標示為延後。 任何客戶端都無法修改此旗標。
其他斷點參數
斷點參數也包括:
通過計數
如果斷點有與其相關聯的傳遞計數,則在目標通過指定的斷點次數之前,將不會啟動它。 您可以使用 GetPassCount找到最初設定的次數。 在啟動之前,可以使用 GetCurrentPassCount來找到引擎通過斷點的剩餘次數。 您可以使用 SetPassCount,將傳遞計數重設為新的值。
比對線程
如果斷點有與其相關聯的線程,引擎會在遇到任何其他線程時予以忽略。 線程可以使用 GetMatchThreadId找到,而且可以使用 setMatchThreadId 來變更。
命令
斷點可能會有與其相關聯的命令。 命令會在斷點被啟用後執行。 您可以使用 GetCommand找到此命令,而且可以使用 SetCommand來變更。
大小
如果斷點是處理器斷點,它必須具有指定的大小。 這會決定記憶體區塊的大小,其存取權將啟動斷點 -- 區塊的開頭是斷點的位置。 您可以使用 GetDataParameters找到大小,而且可以使用 SetDataParameters來變更。
存取類型
如果斷點是處理器斷點,它必須具有存取類型。 這會決定啟動斷點的存取類型。 例如,如果目標讀取、寫入或執行斷點所指定的記憶體,可能會啟動斷點。 存取類型可以使用 GetDataParameters找到,而且可以使用 setDataParameters來變更。
處理器斷點的有效參數
下列存取型態適用於處理器斷點:
價值 | 說明 |
---|---|
DEBUG_BREAK_讀取中斷 |
當 CPU 讀取斷點記憶體區塊中的記憶體時,將會觸發斷點。 |
DEBUG_BREAK_WRITE |
當 CPU 將資料寫入斷點所在的記憶體區塊時,斷點就會被觸發。 |
DEBUG_BREAK_READ |DEBUG_BREAK_WRITE | 當 CPU 讀取或寫入斷點記憶體區塊中的記憶體時,就會觸發斷點。 |
DEBUG_BREAK_EXECUTE(調試中斷執行) |
當 CPU 擷取斷點記憶體區塊中的指令時,將會觸發斷點。 |
DEBUG_BREAK_IO |
當存取斷點記憶體區塊中的 I/O 連接埠時,將會觸發斷點。 (僅限 Windows XP 和 Microsoft Windows Server 2003、僅限內核模式、僅限 x86) |
並非所有的存取類型和大小都支援所有處理器。 支援下列存取類型和大小:
x86
支援所有存取類型。 DEBUG_BREAK_READ 的行為類似於 DEBUG_BREAK_READ | DEBUG_BREAK_WRITE。 大小必須是 1、2 或 4。 斷點的地址必須是尺寸單位的倍數。
x64
支援所有存取類型。 DEBUG_BREAK_READ 的運作方式類似於 DEBUG_BREAK_READ | DEBUG_BREAK_WRITE。 大小必須是 1、2、4 或 8。 斷點的地址必須是該大小的倍數。