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 与其参数之间除外。 例如,如果要指定 s 和 w 选项,请使用命令 -[sw]Type Range Pattern。
可以指定以下一个或多个标志:
s
保存当前搜索的所有结果。 稍后可以使用这些结果重复搜索。
R
将当前搜索限制为上次保存搜索的结果。 不能在同一命令中使用 s 和 r 标志。 使用 r 时, 将忽略 Range 的值,并且调试器仅搜索上 一个 命令 保存的命中。
n点击数
指定使用 s 标志时要保存的命中次数。 默认值为 1024 次命中。 如果将 n 与其他标志一起使用, 则 n 必须是最后一个标志,后跟其 Hits 参数。 n 和 Hits 之间的空格是可选的,但不能在括号中添加任何其他空格。 如果以后使用 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-a 和 s-u 命令分别搜索指定的 ASCII 和 Unicode 字符串。 这些字符串不必以 null 结尾。
s-sa 和 s-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 仅返回正确字节对齐的结果。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈