事件筛选器

事件筛选器 提供简单的事件筛选;它们会影响调试器引擎在目标中发生事件后如何继续。 事件发生时,引擎确定该事件是否与事件筛选器匹配。 如果这样做,事件筛选器的中断状态会影响调试器是否会进入目标。 如果事件是异常事件,则处理状态决定是否应被视为在目标中已处理或未处理。

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

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

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

  2. 特定的异常筛选器。 第一个特定的异常筛选器是 默认异常筛选器。 其他的是由引擎的内置筛选器处理的异常筛选器。 请参阅特定异常,以获取特定异常筛选器的列表。

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

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

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

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

命令和参数

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

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

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

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

某些特定筛选器采用限制筛选器匹配的事件的参数。 GetSpecificFilterArgumentSetSpecificFilterArgument 将为支持参数的那些特定筛选器获取和设置参数。 如果特定筛选器没有参数,则它匹配的事件没有限制。 下表列出了采用参数的事件筛选器及其限制匹配事件的方式:

事件 / 活动 匹配条件

创建进程

所创建进程的名称必须与 argument.1 匹配

退出进程

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

加载模块

加载的模块的名称必须与 argument.1 匹配

卸载模块

卸载模块的基址必须与 argument.2 相同

目标输出

目标中的调试输出必须与 argument.3 匹配

注释  

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

  2. 该参数是由引擎在设置参数时计算的表达式。

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

索引和异常代码

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

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

特定事件筛选器

0

SpecificEvents

特定异常筛选器

SpecificEvents

SpecificExceptions

任意异常筛选器

SpecificEvents + SpecificExceptions

任意异常

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

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

系统错误

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