Debugging Tools for Windows

!search

!search扩展命令在物理内存的页面中搜索匹配指定目标的指针大小的数据。

语法

Windows 2000的语法

!search Data [ Delta [ StartPFN EndPFN ]]] 
!search -? 

Windows XP和之后的语法

!search [-s] [-pData [ Delta [ StartPFN EndPFN ]]] 
!search -? 

参数

-s
(Windows XP和之后) 忽略搜索中遇到的符号校验错误。在遇到很多"incorrect symbols for kernel"错误时非常有用。
-p
(Windows XP和之后) Data当作32位值,不进行任何符号扩展。
Data
指定要搜索的数据。Data必须和目标系统上的指针大小(32位或64位)一样。和Data精确匹配的值总是会显示出来。其他匹配的值根据Delta的设置,可能也会显示出来,详细信息可以查看后面的注释节。
Delta
指定内存中的值和Data之间允许存在的误差。查看注释部分获得详细信息。
StartPFN
指定要搜索的范围开始位置的页面帧序号(PFN)。如果省略,则从物理页面的最低地址开始搜索。
EndPFN
指定搜索范围结束处的页面帧序号(PFN)。如果省略,则在物理页面的最高地址处结束搜索。
-?
在调试器命令窗口中显示该扩展命令的帮助。

DLL

Windows 2000 Kdextx86.dll
Windows XP和之后 Kdexts.dll

注释

如果指定了StartPFNEndPFN,它们会被当作要搜索的物理内存区域的开始和结束位置的页面帧序号。关于页面帧序号的说明,查看将虚拟地址转换成物理地址。如果省略StartPFNEndPFN,则搜索所有物理内存。

在Windows 2000中,每个页面只会显示第一个匹配项,除非StartPFNEndPFN相同。在Windows XP和之后,可以显示所有的匹配项。

!search扩展会搜索指定的页面范围中所有内存,并且检查每个按ULONG_PTR 对齐的值。满足下面这些条件中至少一个的值会被显示出来:

大多数情况下,Data用来指定感兴趣的地址,但是允许指定任何ULONG_PTR 大小的数据。

由于调试器的搜索引擎的结构保存在目标机内存中,如果搜索所有内存(或者和这些结构有重合的区域),则会看到在这些结构保存的内存里面也找到了匹配。如果要消除这些匹配,可以搜索一个随机值,这样就能找出调试器的搜索结构保存的位置。

下面是一些例子。这个命令在PFN为0x237D 的内存中搜索0x80001230 到0x80001238之间的值:

kd> !search 80001234 4 237d 237d 

下面的命令在PFN 0x2370 到0x237F的范围内搜索和0x0F100F0F相差不超过1 bit的值。精确匹配在下面用粗体标识,其他的有1个bit的差异:

kd> !search 0f100f0f 0 2370 237f
Searching PFNs in range 00002370 - 0000237F for [0F100F0F - 0F100F0F]

Pfn      Offset   Hit      Va       Pte      
- - - - - - - - - - - - - - - - - - - - - - - - - - -
0000237B 00000368 0F000F0F 01003368 C0004014 
0000237C 00000100 0F100F0F 01004100 C0004014 
0000237D 000003A8 0F100F0F 010053A8 C0004014 
0000237D 000003C8 0F100F8F 010053C8 C0004014 
0000237D 000003E8 0F100F0F 010053E8 C0004014 
0000237D 00000408 0F100F0F 01005408 C0004014 
0000237D 00000428 0F100F8F 01005428 C0004014 
Search done.

显示出来的列有这些: Pfn是页面的页面帧序号(PFN);Offset是在页面中的偏移;Hit是在该地址的值;Va是该物理地址映射到的虚拟地址(如果存在并且可以获得);Pte是页表项(PTE)。

要计算物理地址(疑为虚拟地址 — 译者),可以将PFN左移3个16进制数字(12 bit)然后加上偏移。例如,上表中最后以行的虚拟地址是0x0237D000 + 0x428 = 0x02347D428。

附加信息

更多显示和搜索物理内存的方法,查看读写内存

Build machine: CAPEBUILD