事件過濾器提供 簡單的事件過濾;它們會影響偵錯工具引擎在目標中發生事件之後的進行方式。 當事件發生時,引擎會判斷該事件是否符合事件篩選器。 如果是,事件篩選的中斷狀態會影響偵錯工具是否會中斷進入目標。 如果事件是例外狀況事件,則處理狀態會決定在目標中是否應將例外狀況視為已處理或未處理。
注意 如果需要更複雜的事件過濾,可以使用事件回呼。
事件篩選器分為三個類別。
特定事件篩選器。 這些是所有非例外狀況事件的篩選器。 有關這些事件的列表,請參閱 DEBUG_FILTER_XXX 。
特定例外狀況篩選器。 第一個特定例外狀況篩選器是 預設例外狀況篩選器。 其餘的過濾器是針對這些引擎擁有內建過濾器的例外情況所設計。 如需特定例外狀況篩選器的清單,請參閱 特定例外狀況 。
任意例外狀況篩選。 這些是手動新增的例外狀況事件的篩選器。
類別 1 和 2 中的過濾器統稱為 特定過濾器,類別 2 和 3 中的過濾器統稱為 異常狀況過濾器。 每個類別中的篩選器數目是由 GetNumberEventFilters 傳回。
如果事件的類型與過濾器的類型相同,則事件會符合特定事件過濾器。 某些事件過濾器具有額外的參數,可進一步限制它們匹配的事件。
如果異常事件的異常代碼與異常過濾器的異常代碼相同,則異常事件匹配異常過濾器。 如果沒有異常過濾器與異常事件具有相同的異常代碼,則異常事件將由預設異常過濾器處理。
命令和參數
事件篩選可以有與其相關聯的偵錯工具命令。 當發生符合篩選器的事件時,引擎會執行此命令。 GetEventFilterCommand 和 SetEventFilterCommand 可用來取得和設定此命令。 對於異常狀況過濾器,此命令會在異常狀況的第一次機會上執行。 可以在第二次機會例外狀況事件發生時執行一個獨立的第二次機會命令。 若要取得並設定第二次機會命令,請使用 GetExceptionFilterSecondCommand 和 SetExceptionSecondChanceCommand。
特定事件篩選和例外狀況篩選的參數是由 GetSpecificFilterParameters 和 GetExceptionFilterParameters 傳回。 事件篩選的中斷狀態和處理狀態可以使用 SetSpecificFilterParameters 和 SetExceptionFilterParameters 來設定。
SetExceptionFilterParameters 也可用來新增和移除任意例外狀況篩選。
GetEventFilterText 會傳回特定篩選的簡短描述。
某些特定篩選器採用引數來限制篩選器相符的事件。 GetSpecificFilterArgument 和 SetSpecificFilterArgument 用來取得和設定那些支援引數的特定篩選器的引數。 如果特定篩選器沒有引數,則對其匹配的事件沒有限制。 下表列出採用引數的事件篩選器,以及它們如何限制符合引數的事件:
| 事件 | 比對條件 |
|---|---|
建立流程 |
所建立處理程序的名稱必須符合引數。 |
退出流程 |
已結束處理程序的名稱必須符合引數。 |
載入模組 |
載入模組的名稱必須符合引數。 |
卸載模組 |
卸載模組的基底位址必須與引數相同。 |
目標輸出 |
目標的偵錯輸出必須符合引數。 |
注意
引數使用 字串萬用字元語法 ,並在事件發生時與影像名稱 (忽略路徑) 進行比較。 如果模組或進程的名稱無法獲得,則會將其視為符合。
引數是設定引數時引擎所評估的運算式。
引數會使用字串萬用字元語法,並與目標的偵錯輸出進行比較。 如果輸出未知,則會將其視為相符。
索引和異常代碼
每個事件篩選器都有一個索引。 索引是比篩選器總數(含)小零到一之間的數字。 您可以從 GetNumberEventFilters 傳回的 SpecificEvents、SpecificExceptions 和 ArbitraryExceptions 值中找到每個篩選類別的索引範圍,如下表所述:
| 事件篩選器 | 第一個過濾器的索引 | 篩選器數目 |
|---|---|---|
特定事件篩選器 |
0 |
特定事件 |
特定例外狀況篩選 |
特定事件 |
特定例外狀況 |
任意例外狀況篩選 |
特定事件 + 特定例外狀況 |
任意例外狀況 |
特定事件過濾器的索引位於主題 DEBUG_FILTER_XXX中的第一個表格中。 預設例外狀況篩選器 (第一個特定例外狀況篩選器) 的索引是 SpecificEvents。 移除任意例外狀況篩選器時,其他任意例外狀況篩選器的索引可能會變更。
異常狀況篩選器通常由異常狀況程式碼指定。 不過,某些方法需要例外狀況的索引。 若要尋找指定例外狀況的例外狀況篩選索引,請使用 GetExceptionFilterParameters 逐一查看所有例外狀況篩選器,直到找到與例外狀況具有相同例外狀況代碼的例外狀況篩選器為止。 您可以在 特定異常狀況主題中找到特定異常狀況過濾器的異常狀況碼。
系統錯誤
發生系統錯誤時,如果錯誤發生在指定層級或低於指定層級,引擎會進入偵錯工具或將錯誤列印至輸出流。 這些層級是由 GetSystemErrorControl 傳回,而且可以使用 SetSystemErrorControl 來變更。