s(搜索内存)

命令在内存中搜索以查找特定的字节模式。

请勿将此命令与 ~s (更改当前处理器) ~s (设置当前线程) |s (设置当前进程) || (设置当前系统) 命令。

s [-[[Flags]Type]] Range Pattern 
s -[[Flags]]v Range Object 
s -[[Flags]]sa Range 
s -[[Flags]]su Range 

参数

[Flags]
指定一个或多个搜索选项。 每个标志都是一个字母。 必须将标志括在一组方括号中, ([]) 。 不能在括号之间添加空格, n 或l 与其参数之间除外。 例如,如果要指定 sw 选项,请使用命令 -[sw]Type Range Pattern。

可以指定以下一个或多个标志:

s
保存当前搜索的所有结果。 稍后可以使用这些结果重复搜索。

R
将当前搜索限制为上次保存搜索的结果。 不能在同一命令中使用 sr 标志。 使用 r 时, 将忽略 Range 的值,并且调试器仅搜索上 一个 命令 保存的命中。

n点击数
指定使用 s 标志时要保存的命中次数。 默认值为 1024 次命中。 如果将 n 与其他标志一起使用, 则 n 必须是最后一个标志,后跟其 Hits 参数。 nHits 之间的空格是可选的,但不能在括号中添加任何其他空格。 如果以后使用 s 标志的任何搜索发现超过指定的命中次数,则会显示 Overflow 错误消息 ,通知你并非所有命中都已保存。

l长度
导致搜索任意 ASCII 或 Unicode 字符串仅返回长度至少为 Length 字符的字符串。 默认长度为 3。 此值仅影响使用 -sa-su 标志的搜索。

w
仅搜索可写内存区域。 必须将“w”括在方括号中。

1
仅显示搜索输出中搜索匹配项的地址。 如果使用 .foreach 令牌将命令输出管道传递到另一个命令的输入,则此选项非常有用。

Type
指定要搜索的内存类型。 在 类型 前面添加连字符 ( ) 。 可以使用以下 类型 值之一。

类型 说明

b

字节 (8 位)

w

WORD (16 位)

d

DWORD (32 位)

q

QWORD (64 位)

a

ASCII 字符串 (不一定是以 null 结尾的字符串)

u

Unicode 字符串 (不一定是以 null 结尾的字符串)

如果省略 Type,则使用字节值。 但是,如果使用 标志,则不能省略 类型

Sa
搜索包含可打印 ASCII 字符串的任何内存。 使用 lLength 标志指定此类字符串的最小长度。 默认最小长度为 3 个字符。


搜索包含可打印 Unicode 字符串的任何内存。 使用 lLength 标志指定此类字符串的最小长度。 默认最小长度为 3 个字符。

Range
指定要搜索的内存区域。 除非使用 L? 语法,否则此范围长度不能超过 256 MB。 有关此语法的详细信息,请参阅 地址和地址范围语法

模式
指定要搜索的一个或多个值。 默认情况下,这些值是字节值。 可以在 Type 中指定不同类型的内存。 如果指定 WORD、DWORD 或 QWORD 值,则根据所选的其他选项,可能需要将搜索模式括在单引号 (例如 “H”) 。

0:000> s -d @rsp L1000000 'H'  
0000003f`ff07ec00  00000048 00000000 500c0163 00000000  H.......c..P....
0000003f`ff07ec50  00000048 00000000 00000080 00000000  H...............
0000003f`ff07efc0  00000048 00000000 400c0060 00000000  H.......`..@....

如果使用 ascii 类型指定字符串,请将它括在双引号 (例如 “B7”) 。

0:000> s -a @rsp L10000000 "B7"  
0000003f`ff07ef0a  42 37 ff 7f 00 00 90 38-4e c2 6c 01 00 00 7d 26  B7.....8N.l...}&
0000003f`ff0ff322  42 37 ff 7f 00 00 f8 5d-42 37 ff 7f 00 00 20 41  B7.....]B7.... A
0000003f`ff0ff32a  42 37 ff 7f 00 00 20 41-42 37 ff 7f 00 00 98 59  B7.... AB7.....Y

-V
搜索与指定 Object 类型相同的 对象

对象
指定对象的地址或指向对象的指针的地址。 然后,调试器搜索与 Object 指定的对象类型相同的对象。

环境

说明
模式 用户模式、内核模式
目标 实时、故障转储
平台 全部

其他信息

有关内存操作和其他内存相关命令的说明的详细信息,请参阅 读取和写入内存

注解

如果调试器找到指定的字节模式,则调试器会在找到该模式的 “范围 内存”区域中显示第一个内存地址。 调试器以与指定的 类型 内存类型匹配的格式显示从该位置开始的内存摘录。 如果 Type为 或u,则显示内存内容和相应的 ASCII 或 Unicode 字符。

除非指定其他 Type 值,否则必须将 Pattern 参数指定为一系列字节。 可以输入字节值作为数字或 ASCII 字符:

  • 数值解释为当前基数 (16、10 或 8) 。 若要更改默认基数,请使用 n (Set Number Base) 命令。 可以通过指定 0x 前缀 (十六进制) 、 0n 前缀 (十进制) 、 0t 前缀 (八进制) 或 0y 前缀 (二进制) 来替代默认基数。 注意 使用 C++ 表达式时,默认基数的行为有所不同。 有关这些表达式和基数的详细信息,请参阅 计算表达式

  • 必须将 ASCII 字符括在单引号中。 不能使用 C 样式转义字符 (,例如“\0”或“\n”) 。

如果指定多个字节,则必须用空格分隔它们。

s-as-u 命令分别搜索指定的 ASCII 和 Unicode 字符串。 这些字符串不必以 null 结尾。

s-sas-su 命令搜索未指定的 ASCII 和 Unicode 字符串。 如果要检查一系列内存以查看内存是否包含任何可打印字符,则这些内容非常有用。 使用标志选项可以指定要查找的字符串的最小长度。

示例:以下命令在范围中查找长度 >为 =3 的 ASCII 字符串,这些字符串从 0000000140000000 开始,然后以 400 个字节结尾。

s-sa 0000000140000000 L400

以下命令在范围中查找长度 >=4 的 ASCII 字符串,这些字符串从 0000000140000000 开始,然后以 400 字节结尾

s -[l4]sa 0000000140000000 L400

以下命令执行相同的操作,但它将搜索限制为可写内存区域。

s -[wl4]sa 0000000140000000 L400

以下命令执行相同的操作,但只显示匹配项的地址,而不是地址和值。

s -[1wl4]sa 0000000140000000 L400

s-v 命令搜索与 Object 对象具有相同数据类型的对象。 仅当所需的对象是 C++ 类或与虚拟函数表关联的另一个对象 (Vtables) 时,才能使用此命令。 s-v 命令在 Range 内存区域中搜索此类 Vtable 的地址。 如果此类中存在多个 Vtable,则搜索算法会查找所有这些指针值,并用适当的字节数分隔。 如果找到任何匹配项,调试器将返回对象的基址和有关此对象的完整信息,类似于 dt (Display Type) 命令的输出。

示例:假设当前基数为 16。 以下三个命令执行相同的操作:在内存位置 0012FF40 到 0012FF5F 中搜索“Hello”。

0:000> s 0012ff40 L20 'H' 'e' 'l' 'l' 'o' 
0:000> s 0012ff40 L20 48 65 6c 6c 6f 
0:000> s -a 0012ff40 L20 "Hello" 

这些命令查找“Hello”的每个外观,并返回每个此类模式的地址,即字母“H”的地址。

调试器仅返回完全包含在搜索范围中的模式。 正确找到重叠模式。 (换句话说,模式“QQQQ”在“QQQQ”中找到三次。)

以下示例演示使用 Type 参数的搜索。 此命令在内存位置 0012FF40 到 0012FF5F 中搜索双字“VUTS”:

0:000> s -d 0012ff40 L20 'VUTS' 

在 little-endian 计算机上,“VUTS”与字节模式“S”、“T”、“U”“V”相同。 但是,搜索 WORD、DWORD 和 QWORD 仅返回正确字节对齐的结果。