事件筛选器 提供简单的事件筛选;它们会影响调试器引擎在目标中发生事件后如何继续。 事件发生时,引擎确定该事件是否与事件筛选器匹配。 如果这样做,事件筛选器的中断状态会影响调试器是否会进入目标。 如果事件是异常事件,则处理状态决定是否应被视为在目标中已处理或未处理。
注意 如果需要更复杂的事件筛选,可以使用事件回调。
事件筛选器分为三个类别。
特定事件筛选器。 这些是所有非异常事件的筛选器。 有关这些事件的列表 ,请参阅DEBUG_FILTER_XXX 。
特定的异常筛选器。 第一个特定的异常筛选器是 默认异常筛选器。 其他的是由引擎的内置筛选器处理的异常筛选器。 请参阅特定异常,以获取特定异常筛选器的列表。
任意异常筛选器。 这些是手动添加的异常事件筛选器。
类别 1 和 2 中的筛选器统称为 特定筛选器,类别 2 和 3 中的筛选器统称为 异常筛选器。 GetNumberEventFilters 返回每个类别中的筛选器数。
如果事件的类型与筛选器的类型相同,则事件与特定事件筛选器匹配。 某些事件筛选器具有一个附加参数,进一步限制它们匹配的事件。
如果异常事件的异常代码与异常筛选器的异常代码相同,则异常事件与异常筛选器的异常代码匹配。 如果没有与异常事件相同的异常代码的异常筛选器,则默认异常筛选器将处理异常事件。
命令和参数
事件筛选器可以具有与之关联的调试器命令。 当发生与筛选器匹配的事件时,引擎将执行此命令。 GetEventFilterCommand 和 SetEventFilterCommand 可用于获取和设置此命令。 对于异常筛选器,此命令在异常的第一次机会上执行。 发生第二次机会异常事件时,可以执行一个独立的第二次机会命令。 若要获取和设置第二次机会命令,请使用 GetExceptionFilterSecondCommand 和 SetExceptionSecondChanceCommand。
GetSpecificFilterParameters 和 GetExceptionFilterParameters 返回特定事件筛选器和异常筛选器的参数。 可以使用 SetSpecificFilterParameters 和 SetExceptionFilterParameters 设置事件筛选器的中断状态和处理状态。
SetExceptionFilterParameters 还可用于添加和删除任意异常筛选器。
GetEventFilterText 返回特定筛选器的简短说明。
某些特定筛选器采用限制筛选器匹配的事件的参数。 GetSpecificFilterArgument 和 SetSpecificFilterArgument 将为支持参数的那些特定筛选器获取和设置参数。 如果特定筛选器没有参数,则它匹配的事件没有限制。 下表列出了采用参数的事件筛选器及其限制匹配事件的方式:
| 事件 / 活动 | 匹配条件 |
|---|---|
创建进程 |
所创建进程的名称必须与 argument.1 匹配 |
退出进程 |
退出进程的名称必须与参数1相匹配。 |
加载模块 |
加载的模块的名称必须与 argument.1 匹配 |
卸载模块 |
卸载模块的基址必须与 argument.2 相同 |
目标输出 |
目标中的调试输出必须与 argument.3 匹配 |
注释
该参数使用 字符串通配符语法 ,并在事件发生时与图像名称(忽略路径)进行比较。 如果模块或进程的名称不可用,则认为已匹配。
该参数是由引擎在设置参数时计算的表达式。
该参数使用字符串通配符语法,并与目标的调试输出进行比较。 如果输出未知,则视作匹配。
索引和异常代码
每个事件筛选器都有一个索引。 索引是介于零到一个之间的数字,小于筛选器总数(含)。 可以从 GetNumberEventFilters 返回的 SpecificEvents、SpecificExceptions、ArbitraryExceptions 值中找到每个类别筛选器的索引范围,如下表所述:
| 事件筛选器 | 第一个筛选器的索引 | 筛选器数 |
|---|---|---|
特定事件筛选器 |
0 |
SpecificEvents |
特定异常筛选器 |
SpecificEvents |
SpecificExceptions |
任意异常筛选器 |
SpecificEvents + SpecificExceptions |
任意异常 |
特定事件筛选器的索引位于主题 DEBUG_FILTER_XXX的第一个表中。 默认异常筛选器(第一个特定异常筛选器)的索引是 SpecificEvents。 删除任意异常筛选器后,其他任意异常筛选器的索引可能会更改。
异常筛选器通常由异常代码指定。 但是,某些方法需要异常的索引。 若要查找给定异常的异常筛选器的索引,请使用 GetExceptionFilterParameters 循环访问所有异常筛选器,直到找到与异常具有相同异常代码的异常筛选器。 特定异常筛选器的异常代码可在主题 “特定异常”中找到。
系统错误
当发生系统错误时,如果错误发生在指定级别或低于该级别,引擎将进入调试器或将错误打印到输出流。 这些级别由 GetSystemErrorControl 返回,可以使用 SetSystemErrorControl 进行更改。