事件筛选器

事件筛选器 提供简单的事件筛选;它们会影响在目标中发生事件后调试器引擎的运行情况。 事件发生时,引擎将确定该事件是否与事件筛选器匹配。 如果是,则事件筛选器的中断状态会影响调试器是否将中断目标。 如果事件是异常事件,则处理状态将确定是否应在目标中将异常视为已处理。

注意 如果需要更复杂的事件筛选,可以使用事件回调。

事件筛选器分为三个类别。

  1. 特定事件筛选器。 这些是所有非异常事件的筛选器。 有关 DEBUG_FILTER_XXX 的列表,请参阅事件列表。

  2. 特定异常筛选器。 第一个特定异常筛选器 是默认异常筛选器。 其余是引擎具有内置筛选器的异常的筛选器。 有关 特定异常 筛选器的列表,请参阅特定异常。

  3. 任意异常筛选器。 这些是已手动添加的异常事件的筛选器。

类别 1 和类别 2 中的筛选器统称为特定筛选器,类别 2 和类别 3 中的筛选器统称为异常筛选器。 每个类别中的筛选器数由 GetNumberEventFilters 返回

如果事件的类型与筛选器的类型相同,则事件与特定事件筛选器匹配。 某些事件筛选器具有一个附加参数,该参数进一步限制它们匹配的事件。

如果异常事件的异常代码与异常筛选器的异常代码相同,则异常事件与异常筛选器匹配。 如果没有与异常事件相同的异常代码的异常筛选器,则异常事件将由默认异常筛选器处理。

命令和参数

事件筛选器可以具有与之关联的调试器命令。 发生与筛选器匹配的事件时,引擎将执行此命令。 GetEventFilterCommandSetEventFilterCommand 可用于获取和设置此命令。 对于异常筛选器,此命令在出现异常的第一个可能时执行。 可以在第二个可能异常事件时执行单独的第二机会命令。 若要获取并设置第二机会命令,请使用 GetExceptionFilterSecondCommandSetExceptionSecondChanceCommand

特定事件筛选器和异常筛选器的参数由 GetSpecificFilterParametersGetExceptionFilterParameters 返回。 可以使用 SetSpecificFilterParametersSetExceptionFilterParameters 设置事件筛选器的中断状态和处理状态。

SetExceptionFilterParameters 还可用于添加和删除任意异常筛选器。

GetEventFilterText 返回特定筛选器的简短说明

某些特定筛选器使用参数来限制筛选器匹配的事件。 GetSpecificFilterArgumentSetSpecificFilterArgument 将为支持参数的特定筛选器获取和设置参数。 如果特定筛选器没有参数,则对它匹配的事件没有限制。 下表列出了接受参数的事件筛选器,以及它们如何限制匹配它们的事件:

事件 匹配条件

创建过程

创建的进程的名称必须与 参数匹配。1

退出进程

退出的进程的名称必须与 参数匹配。1

加载模块

加载的模块的名称必须与 参数匹配。1

卸载模块

已卸载模块的基地址必须与 参数相同。2

目标输出

目标中的调试输出必须与 参数匹配。3

注意  

  1. 参数使用 字符串通配符语法 ,与图像名称进行比较 (忽略) 事件时的路径。 如果模块或进程的名称不可用,则视为匹配。

  2. 参数是一个表达式,在设置参数时由引擎计算。

  3. 参数使用字符串通配符语法,并与目标中的调试输出进行比较。 如果输出未知,则视为匹配。

索引和异常代码

每个事件筛选器都有一个索引。 索引是一个介于 0 和 1 之间的数字,小于非独占筛选器 (总数) 。 每个类别的筛选器的索引范围可以从 GetNumberEventFilters 返回的 SpecificEventsSpecificExceptionsArbitraryExceptions 值找到,如下表所述:

事件筛选器 第一个筛选器的索引 筛选器数

特定事件筛选器

0

SpecificEvents

特定异常筛选器

SpecificEvents

SpecificExceptions

任意异常筛选器

SpecificEvents + SpecificExceptions

ArbitraryExceptions

特定事件筛选器的索引位于主题筛选器的第一个表中DEBUG_FILTER_XXX。 第一个特定异常筛选器 (的默认异常筛选器的索引) SpecificEvents。 删除任意异常筛选器时,其他任意异常筛选器的索引可能会更改。

异常筛选器通常由异常代码指定。 但是,某些方法需要异常的索引。 若要查找给定异常的异常筛选器的索引,请使用 GetExceptionFilterParameters 来访问所有异常筛选器,直到找到异常代码与异常相同的异常筛选器。 特定异常筛选器的异常代码可在主题特定异常 中找到

系统错误

发生系统错误时,如果错误发生在指定级别或以下级别,引擎将中断调试器或将错误输出到输出流。 这些级别由 GetSystemErrorControl 返回,可以使用 SetSystemErrorControl 进行更改