Debugging Tools for Windows

.step_filter (Set Step Filter)

.step_filter 命令创建一个在跟踪时要跳过(步过)的函数列表。这使得可以跟踪代码并且只跳过特定的函数。也可以在源码模式下一行中有多个函数调用时用来对单步进行控制。

语法

.step_filter "FilterList" 
.step_filter /c 
.step_filter 

参数

"FilterList"
指定要步过的函数关联的符号。FilterList 可以包含任意多个用分号分隔的文本模板。每个模板都可以包含各种通配符和修饰符,查看字符串通配符语法获取详细信息。符号匹配其中某个模板的函数将会在跟踪时被步过。每次使用.step_filter "FilterList" 时,先前的过滤列表都会完全被新列表替代。
/c
清除过滤列表。

环境

模式 用户模式、内核模式
目标 活动目标、崩溃转储
平台 所有

注释

不带参数时,.step_filter 显示当前的过滤列表。

一般来说,一个跟踪命令 (例如t或者WinDbg的Debug | Step Into按钮) 将会跟踪进入函数调用中。但是,如果被调用函数关联的符号能够匹配FilterList 中的模板,则该函数会被步过 — 就像使用单步命令一样 (例如p) 。

如果指令指针在过滤列表中列出的代码里面,任何跟踪或单步命令都会执行到函数返回,就像gu命令或者WinDbg 的Step Out 按钮一样。当然,过滤器首先就会避免跟踪到这些代码中,所以这种情况只会在改变了过滤器或者遇到断点时发生。

例如,下面的命令使得跟踪命令跳过所有的CRT调用:

.step_filter "msvcrt!*" 

.step_filter 命令在源码模式调试时最有用,因为单行源码上可以有多个函数调用。p t 命令没有办法区分这些函数调用。

例如,下面一行中, t 命令将会单步进入GetTickCountprintf,而p命令会同时步过两个函数调用:

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

.step_filter 命令允许忽略某个调用但是跟踪到另一个中。

由于函数是由符号来标识的,所以单个过滤器就可以包含整个模块。这使得可以过滤掉所有的框架函数 — 例如,微软基本类库(MFC) 或活动模板库(ATL) 的调用。

在汇编模式下调试时,每个调用都在单独的行上,所以可以选择是单步还是一行一行的跟踪。所以汇编模式下.step_filter不是非常有用。

Build machine: CAPEBUILD