s(搜索内存)

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

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

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

参数

[ 标志]
指定一个或多个搜索选项。 每个标志都是一个字母。 必须将标志括在一组括号中([])。 不能在方括号之间添加空格,但 nl 与其参数之间除外。 例如,如果要指定 sw 选项,请使用命令 s -[sw]类型范围模式。

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

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

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

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

l Length
导致搜索任意 ASCII 或 Unicode 字符串仅返回长度至少 为长度 字符的字符串。 默认长度为 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 字符串的任何内存。 使用 l Length 标志指定此类字符串的最小长度。 默认最小长度为 3 个字符。


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

范围
指定要搜索的内存区域。 除非使用 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 指定的对象类型相同的对象

环境

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

其他信息

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

注解

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

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

  • 数值解释为当前弧度中的数字(16、10 或 8)。 若要更改默认基数,请使用 n(设置基数)命令。 可以通过指定 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

以下命令查找从0000000140000000开始的范围中长度 >为 =4 的 ASCII 字符串,并在以后结束 400 个字节

s -[l4]sa 0000000140000000 L400

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

s -[wl4]sa 0000000140000000 L400

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

s -[1wl4]sa 0000000140000000 L400

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

示例:假定当前弧度为 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”在“QQQQQ”中找到三次。

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

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

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