Debugging Tools for Windows

s (Search Memory)

s 命令搜索内存查找指定模板。

不要将该命令和~s (Change Current Processor)~s (Set Current Thread)|s (Set Current Process)||s (Set Current System)命令混淆。

语法

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

参数

[Flags]
指定一个或多个搜索选项。每个标志都是一个单独的字母。必须将标志包含在单独的一对中括号 ([])中。除了nl和它们的参数外,中括号中不能有空格。 例如,如果要指定sw选项,使用s -[sw]Type Range Pattern命令。

可以指定下面这些标志的一个或多个:

s
保存当前搜索的所有结果。之后可以使用该结果来进行重复的搜索。
r
将当前搜索限制在上一次搜索的结果中。一个命令中不能同时使用sr 标志。使用r时,Range的值被忽略,并且调试器仅搜索上一次s命令保存下来的结果。
n Hits
指定使用s标志时要保存的结果个数。默认值是1024个结果。如果将n和其他标志一起使用,n必须是最后一个标志,后面跟它的Hits 参数。nhit之间的空格是可选的,但是在中括号中不能再添加其他空格。如果之后使用s标志的搜索发现了比指定值更多的结果,则会显示Overflow error 信息来提示所有的结果都不会被保存。
l Length
使得对任意ASCII或Unicode字符串的搜索只返回比Length 个字符长的结果。默认值为3。这个值只在使用-sa-su 标志时有用。
w
只搜索可写入的内存区域。必须用中括号包含"w"。
1
在搜索输出中仅显示匹配项的地址。该选项在使用.foreach把输出通过管道传递给其他命令作为输入时很有用。
Type
指定要搜索的内存类型。在Type 前加上连字符 (-)。可以使用下面的Type值之一。
类型 说明
b Byte (8位)
w WORD (16位)
d DWORD (32位)
q QWORD (64位)
a ASCII string
(不一定要null结尾的字符串)
u Unicode string
(不一定要null结尾的字符串)

如果省略掉Type,则会使用字节值。但是如果使用Flags,就不能省略Type

sa
搜索任何包含可打印的ASCII字符串的内存。使用l Length 标志来指定这种字符串的最小长度。默认的最小长度为3个字符。
su
搜索任何包含可打印的Unicode字符串的内存。使用l Length 标志来指定这种字符串的最小长度。默认的最小长度为3个字符。
Range
指定要搜索的内存范围。如果没有使用L? 语法则该区域不能大于256 MB。关于该语法的更多信息,查看地址和地址区域语法
Pattern
指定要搜索的一个或多个值。默认情况下这是字节值。可以在Type 中指定不同的内存类型。如果指定WORD、DWORD或QWORD 值,要使用单引号括起来 (如'Tag7')。如果指定字符串,要用双引号括起来 (例如"This string")。
-v
搜索和指定的Object 同样类型的对象。
Object
指定一个对象的地址或指向一个对象的指针的地址。之后调试器会搜索和指定的Object类型相同的对象。

环境

模式 用户模式、内核模式
目标 活动目标,崩溃转储
平台 所有

注释

如果用调试器查找指定的字节模板,则会显示Range 内存区域中匹配模板的内容的第一个内存地址。调试器会以匹配Type 内存类型的格式显示以该位置开始的内存的摘要信息。如果Typea u,则显示内存内容和相应的ASCII或Unicode字符。

如果没有指定其他Type 值,Pattern 必须指定一系列字节。可以输入字节值作为数值或ASCII字符:

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

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

s-sa s-su 命令搜索未指定的ASCII和Unicode字符串。这在检查某段内存是否包含可打印字符时有用。

s-v 命令搜索和Object 对象有相同类型的对象。该命令只能用来搜索C++ 类对象或和虚函数表(Vtables)关联的其他对象。s-v命令在 Range 内存区域中搜索类的Vtables 。如果该类有多个Vtables ,搜索算法查找被一些固有的字节分开的所有的指针值。如果找到了任何普配,调试器返回对象的基地址和完整信息 — 类似dt (Display Type)命令的输出。

下面的代码示例了如何使用s命令。假设当前基数是16,下面的命令在0012FF40 到0012FF5F的内存中搜索"Hello"。

0:000> s 0012ff40 L20 'H' 'e' 'l' 'l' 'o' 

下面的命令有相同作用。

0:000> s 0012ff40 L20 48 65 6c 6c 6f 

这个s-a命令也有相同作用。

0:000> s -a 0012ff40 L20 "Hello" 

这些命令定位"Hello"出现的每个地方并返回每个模板匹配项的地址 — 即字母"H"的地址。

调试器只返回搜索区域中完整包含模板的位置。重叠的模板也能被正确找出来。 (即,在"QQQQQ"中,会找到三个"QQQ"模板。)

下面是使用Type 参数进行搜索的示例。该命令在0012FF40 到0012FF5F的内存位置搜索双字'VUTS':

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

在小尾(little-endian)计算机上,'VUTS' 和字节模板'S' 'T' 'U' 'V'一样。但是,对WORD、DWORD和QWORD的搜索只返回正确的字节对齐的结果。

附加信息

关于内存操作和的更多信息何内存相关命令的说明,查看读写内存

Build machine: CAPEBUILD