.step_filter(设置步骤筛选器)

.step_filter 命令创建跟踪时跳过(已跳过)的函数列表。 这样,就可以跟踪代码并仅跳过某些函数。 当一行有多个函数调用时,还可以在源模式下使用它来控制步骤执行。

.step_filter "FilterList" 
.step_filter /c 
.step_filter 

参数

"FilterList"
指定与要跳过的函数关联的符号。 FilterList 可以包含以分号分隔的任意数量的文本模式。 其中每个模式可能包含各种通配符和说明符;有关详细信息,请参阅字符串通配符语法。 跟踪期间将跳过符号与其中至少一种模式匹配的函数。 每次使用 "FilterList" 时,任何以前的筛选器列表都会被放弃并完全替换为新列表。

/c
清除筛选器列表。

环境

说明
模式 用户模式、内核模式
目标 实时、崩溃转储
平台 全部

注解

如果未使用任何参数,.step_filter 会显示当前筛选器列表。

通常,跟踪命令(例如 t 或 windbg debug | step into])会跟踪函数调用。 但是,如果与被调用的函数关联的符号与 FilterList 指定的模式匹配,该函数将被跳过, 就像使用了步骤命令(例如 p)一样。

如果指令指针位于筛选器列表中列出的代码中,则任何跟踪或步骤命令都将跳过此函数,例如 gu 命令或 WinDbg Step Out(跳出)按钮。 当然,此筛选器将首先阻止跟踪此类代码,因此只有在更改了筛选器或命中断点时,才会发生这种情况。

例如,以下命令将导致跟踪命令跳过所有 CRT 调用:

.step_filter "msvcrt!*" 

在源模式下调试时,.step_filter 命令最有用,因为单个源行上可以有多个函数调用。 pt 命令不能用于分隔这些函数调用。

例如,在以下行中,t 命令将执行 GetTickCount 和 printf,而 p 命令将跳过这两个函数调用:

printf( "%x\n", GetTickCount() );

使用 .step_filter 命令,可以筛选掉其中一个调用,同时仍跟踪另一个调用。

由于函数由符号标识,因此单个筛选器可以包含整个模块。 这样,便可以筛选掉框架函数,例如 Microsoft 基础类 (MFC) 或活动模板库 (ATL) 调用。

在汇编模式下调试时,每个调用都位于不同的行上,因此可以选择是逐行执行还是跟踪。 因此,.step_filter 在汇编模式下并不是很有用。