!search

!search 扩展在物理内存中搜索与指定条件匹配的指针大小数据的页面。

语法

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

参数

-s
导致在搜索期间忽略符号检查错误。 如果出现过多的“内核符号错误”错误,这非常有用。

-p
促使将 Data 值解释为 32 位值,从而阻止任何签名扩展。

Data
指定要搜索的数据。 Data 必须是目标系统上指针的大小(32 位或 64 位)。 始终显示 Data 值的完全匹配项。 还会显示其他匹配项,具体取决于 Delta 的值;有关详细信息,请参阅下面的“备注”部分。

增量
指定内存中的值与 Data 值之间的允许差异。 有关更多详细信息,请参阅下面的“备注”部分。

StartPFN
指定要搜索的范围开头的页帧编号 (PFN)。 如果省略此项,搜索从最低物理页开始。

EndPFN
指定要搜索的范围末尾的页帧编号 (PFN)。 如果省略此项,搜索将在最高物理页结束。

-?
“调试器命令”窗口中显示此扩展的帮助。

DLL

Kdexts.dll

其他信息

有关显示和搜索物理内存的更多方法,请参阅读取和写入内存

注解

如果指定了 StartPFNEndPFN,则这些值将作为要搜索的物理内存中范围的开始和结束的页帧编号。 有关页帧编号的说明,请参阅将虚拟地址转换为物理地址。 如果省略 StartPFNEndPFN,则会搜索所有物理内存。

将显示所有命中。

!search 扩展将搜索指定页面范围中的所有内存,并检查每个 ULONG_PTR 对齐值。 将显示至少满足以下条件之一的值:

  • 该值与 Data 完全匹配。

  • 如果 Delta 为 0 或被省略:该值与 Data 相差一位。

  • 如果 Delta 为非零值:该值与 Data 最多相差 Delta。 换句话说,该值在 [Data - Delta, Data + Delta] 范围内。

  • 如果 Delta 为非零值:该值与范围 (Data - Delta) 中最低的数字相差一位。

在大多数情况下,Data 将指定感兴趣的地址,但可以指定任何 ULONG_PTR 大小的数据。

由于调试器的搜索引擎结构驻留在目标计算机上的内存中,如果搜索所有内存(或包含这些结构的任何范围),将在结构本身所在的区域中看到匹配项。 如果需要消除这些匹配项,请搜索随机值;这将指示调试器的搜索结构位于何处。

下面是一些示例。 下面将在 PFN 0x237D 的内存页中搜索 0x80001230 和 0x80001238(含)之间的值:

kd> !search 80001234 4 237d 237d 

下面将在范围为 PFN 0x2370 到 0x237F 的内存页中搜索 0x0F100F0F 一位中的值。 完全匹配项以粗体表示;其他项将相差一位:

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 左移三个十六进制位(12 位),并添加偏移量。 例如,表中的最后一行是虚拟地址 0x0237D000 + 0x428 = 0x0237D428。