.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 单步出 按钮。 当然,此筛选器会首先阻止此类代码被跟踪到 ,因此只有在更改了筛选器或命中断点时,才会发生这种情况。

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

.step_filter "msvcrt!*" 

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

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

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

.step_filter 命令允许筛选出其中一个调用,同时仍跟踪到另一个调用。

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

在程序集模式下调试时,每个调用都位于不同的行上,因此可以选择是逐行跟踪还是逐行跟踪。 因此 ,.step_filter 在程序集模式下不太有用。