事件筛选器

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

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

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

  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 进行更改。