Debugging Tools for Windows |
!search扩展命令在物理内存的页面中搜索匹配指定目标的指针大小的数据。
Windows 2000的语法
!search -?
Windows XP和之后的语法
!search -?
Windows 2000 | Kdextx86.dll |
Windows XP和之后 | Kdexts.dll |
如果指定了StartPFN和EndPFN,它们会被当作要搜索的物理内存区域的开始和结束位置的页面帧序号。关于页面帧序号的说明,查看将虚拟地址转换成物理地址。如果省略StartPFN和EndPFN,则搜索所有物理内存。
在Windows 2000中,每个页面只会显示第一个匹配项,除非StartPFN和EndPFN相同。在Windows XP和之后,可以显示所有的匹配项。
!search扩展会搜索指定的页面范围中所有内存,并且检查每个按ULONG_PTR 对齐的值。满足下面这些条件中至少一个的值会被显示出来:
大多数情况下,Data用来指定感兴趣的地址,但是允许指定任何ULONG_PTR 大小的数据。
由于调试器的搜索引擎的结构保存在目标机内存中,如果搜索所有内存(或者和这些结构有重合的区域),则会看到在这些结构保存的内存里面也找到了匹配。如果要消除这些匹配,可以搜索一个随机值,这样就能找出调试器的搜索结构保存的位置。
下面是一些例子。这个命令在PFN为0x237D 的内存中搜索0x80001230 到0x80001238之间的值:
下面的命令在PFN 0x2370 到0x237F的范围内搜索和0x0F100F0F相差不超过1 bit的值。精确匹配在下面用粗体标识,其他的有1个bit的差异:
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。
更多显示和搜索物理内存的方法,查看读写内存。