控制中斷點旗標和參數

有許多方法可用來判斷中斷點的基本資訊:

  • GetId 會傳回中斷點識別碼。

  • GetType 會傳回中斷點類型 (軟體或處理器) ,以及設定中斷點的有效處理器類型。

  • GetAdder 會傳回新增中斷點的用戶端。

  • GetOffset 會傳回中斷點的位址。

  • GetOffsetExpression 會傳回指定中斷點位置的運算式字串。

除了其位置和中斷點類型之外,中斷點還有數個控制其行為的參數。

中斷點參數可以透過各種特定方法來控制。 此外,大部分的參數都可以使用 GetParameters一起查詢。

中斷點旗標

中斷點旗標是一種中斷點參數。

您可以使用 GetFlags查詢中斷點旗標。 您可以使用 AddFlagsRemoveFlagsSetFlags來變更它們。

中斷點旗標會形成位欄位。 可用於此位欄位中的可能旗標及其意義如下:

DEBUG_BREAKPOINT_ENABLED
設定此旗標時,會 啟用 中斷點,並具有其正常效果。 未設定此旗標時,中斷點 會停用 ,而且不會有任何作用。 如果您想要暫時停用中斷點,您可以移除此旗標;然後,當您想要重新啟用此中斷點時,可以輕鬆地將此旗標新增回 。

DEBUG_BREAKPOINT_ADDER_ONLY
設定此旗標時,中斷點是 私人中斷點。 只有新增中斷點的用戶端才能看到這個中斷點。 在此情況下,其他用戶端將無法查詢引擎中的中斷點,而且引擎不會將中斷點所產生的事件傳送給其他用戶端。 與這個中斷點相關的所有回呼 (事件和 輸出) 只會傳送至此用戶端。 請參閱 GetAdder

DEBUG_BREAKPOINT_GO_ONLY
設定此旗標時,只有在目標處於不受限制的執行中時,才會觸發中斷點。 如果引擎正在逐步執行目標中的指示,則不會觸發它。

DEBUG_BREAKPOINT_ONE_SHOT
設定此旗標時,中斷點會在第一次觸發時自動移除它本身。

DEBUG_BREAKPOINT_DEFERRED
設定此旗標時,中斷點會 延遲。 當使用符號運算式指定中斷點的位移,而且引擎無法評估運算式時,引擎就會設定此旗標。 每次在目標中載入或取消啟動模組時,引擎都會嘗試針對使用運算式指定其位置的所有中斷點重新評估運算式。 無法評估的那些會標示為延遲。 任何用戶端都無法修改此旗標。

其他中斷點參數

中斷點參數也包括:

傳遞計數
如果中斷點有與其相關聯的傳遞計數,在目標通過指定次數的中斷點之前,將不會啟動它。 使用 GetPassCount即可找到原先設定的傳遞計數。 引擎在使用 GetCurrentPassCount找到中斷點之前,剩餘的次數會先通過中斷點。 傳遞計數可以使用 SetPassCount重設為新的值。

比對執行緒
如果中斷點有與其相關聯的執行緒,引擎會在遇到任何其他執行緒時予以忽略。 您可以使用 GetMatchThreadId找到執行緒,而且可以使用 SetMatchThreadId來變更。

命令
中斷點可能會有與其相關聯的命令。 啟動中斷點時,會執行命令。 您可以使用 GetCommand找到此命令,而且可以使用 SetCommand進行變更。

大小
如果中斷點是處理器中斷點,它必須具有指定的大小。 這會決定記憶體區塊的大小,其存取將會啟動中斷點 -- 區塊的開頭是中斷點的位置。 您可以使用 GetDataParameters找到大小,而且可以使用 SetDataParameters來變更。

存取類型
如果中斷點是處理器中斷點,它必須具有存取類型。 這會決定將啟動中斷點的存取類型。 例如,如果目標從讀取、寫入或執行中斷點指定的記憶體,可能會啟動中斷點。 您可以使用 GetDataParameters找到存取類型,而且可以使用 SetDataParameters來變更。

處理器中斷點的有效參數

下列存取類型適用于處理器中斷點:

描述

DEBUG_BREAK_READ

當 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。 中斷點的位址必須是大小的倍數。