cc682/NetRoc
http://netroc682.spaces.live.com/
s (Search Memory)
s 命令搜索内存查找指定模板。
不要将该命令和~s (Change Current Processor)、~s (Set Current Thread)、|s (Set Current Process)或 ||s (Set Current System) 命令混淆。
语法
s [-[[Flags]]Type] Range Pattern
s -[[Flags]]v Range Object
s -[[Flags]]sa Range
s -[[Flags]]su Range
参数
[Flags]
指定一个或多个搜索选项。每个标志都是一个单独的字母。必须将标志包含在单独的一对中括号 ([])中。除了n或 l和它们的参数外,中括号中不能有空格。 例如,如果要指定s和w选项,使用s -[sw]Type Range Pattern命令。
可以指定下面这些标志的一个或多个:
s
保存当前搜索的所有结果。之后可以使用该结果来进行重复的搜索。
r
将当前搜索限制在上一次搜索的结果中。一个命令中不能同时使用s 和r 标志。使用r时,Range的值被忽略,并且调试器仅搜索上一次s命令保存下来的结果。
n Hits
指定使用s标志时要保存的结果个数。默认值是1024个结果。如果将n和其他标志一起使用,n必须是最后一个标志,后面跟它的Hits 参数。n和hit之间的空格是可选的,但是在中括号中不能再添加其他空格。如果之后使用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 字符串 (不一定要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 内存类型的格式显示以该位置开始的内存的摘要信息。如果Type 是 a 或u,则显示内存内容和相应的ASCII或Unicode字符。
如果没有指定其他Type 值,Pattern 必须指定一系列字节。。可以输入字节值作为数值或ASCII字符:
-
数字值按当前基数(16、 10或 8)进行解析。要改变默认基数,使用
n (Set Number Base)命令。可以使用
0x 前缀(16进制)、
0n 前缀(10进制)、
0t 前缀(8进制)或
0y 前缀(2进制)来覆盖默认的基数。
注意 默认基数的特性在使用C++表达式时不同。关于这些表达式和基数的更多信息,查看表达式求值。
-
每个ASCII字符必须用单独的单引号括起来。不能使用C风格的转义字符 (如 '\0' 或'\n')。
如果指定多个字节,必须用空格分开它们。
s-a 和s-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的搜索只返回正确的字节对齐的结果。
附加信息
关于内存操作和的更多信息何内存相关命令的说明,查看读写内存。
so (Set Kernel Debugging Options)
so 命令设置或显示内核调试选项。
语法
so [Options]
参数
Options
可以是一个或多个下面的选项:
NOEXTWARNING
调试器找不到扩展命令时不显示警告。
NOVERSIONCHECK
不检查调试器扩展DLL的版本。
如果省略Options,则显示当前选项。
环境
模式
|
仅内核模式
|
目标
|
活动目标,崩溃转储
|
平台
|
所有
|
注释
也可以使用_NT_DEBUG_OPTIONS 环境变量来设置内核调试选项。
sq (Set Quiet Mode)
sq 命令打开或关闭安静模式。
语法
sq
sq{e|d}
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标,崩溃转储
|
平台
|
所有
|
注释
sqe 命令打开安静模式,sqd命令关闭。sq 命令打开或关闭安静模式。每个这些命令都可以显示新的安静模式状态。
可以使用KDQUIET 环境变量设置KD或内核模式WinDbg的安静模式。(注意用户模式调试和内核模式调试都存在安静模式,但是只有内核模式才能识别KDQUIET环境变量。)
安静模式有下面三个限制效果:
- 调试器不会在每次扩展DLL加载或卸载时显示信息。
- r (Registers) 命令语法中不再必须使用等于号 (=)。
- 内核调试时中断进目标机,会避免显示很长的警告信息。
不要将静止模式的效果和-myob 命令行选项(CDB 和KD) 或 -Q 命令行选项 (WinDbg)混淆。
ss (Set Symbol Suffix)
ss 命令设置或显示当前用来在数值表达式中进行符号匹配的后缀的值。
语法
ss [a|w|n]
参数
a
指定符号后缀应该为"A",用来匹配很多ASCII版本的符号。
w
指定符号后缀应该是"W",用来匹配很多Unicode版本的符号。
n
指示调试器不应该使用符号后缀。(该参数是默认行为。)
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标,崩溃转储
|
平台
|
所有
|
注释
如果使用不带参数的ss命令,则显示后缀值的当前状态。
附加信息
关于符号匹配的更多信息,查看符号语法和符号匹配。
sx, sxd, sxe, sxi, sxn, sxr, sx- (Set Exceptions)
sx* 命令用来控制被调试的程序发生某个异常或特定事件时,调试器要采取的动作。c
语法
sx
sx{e|d|i|n} [-c "Cmd1"] [-c2 "Cmd2"] [-h] {Exception|Event|*}
sx- [-c "Cmd1"] [-c2 "Cmd2"] {Exception|Event|*}
sxr
参数
-c "Cmd1"
指定一个当异常或事件发生时要执行的命令。该命令在异常的第一次处理机会 时执行,不管该异常是否会中断到调试器。Cmd1 字符串必须包含在引号中。该字符串可以包含多条用分号分隔的命令。-c 和括起来的命令字符串之间的空格是可选的。
-c2 "Cmd2"
指定当异常或事件发生并且没有在第一次处理机会被处理时执行的命令。该命令在异常的第二次处理机会时执行,不管它是否会中断到调试器。Cmd2 字符串必须包含在引号中。该字符串可以包含多条用分号分隔的命令。-c2 和括起来的命令字符串之间的空格是可选的。
-h
改变指定事件的处理状态而不是中断状态。如果Event 是cc、hc、bpec或ssec,-h 选项不是一定需要。
Exception
以当前基数指定命令要作用的异常号码。
Event
指定命令要作用的事件号。这些事件都是用短的缩写指定的。事件列表查看控制异常和事件。
*
作用于所有没有用sx 明确命令的异常。明确命名的异常的列表,查看控制异常和事件。
环境
模式
|
用户模式、内核模式
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
sx 命令显示当前进程的异常列表和所有非异常的事件列表,并且显示调试器遇到每个异常和事件时的行为。
Sxe、sxd、sxn和sxi 命令控制调试器针对每个异常和事件的设置。
sxr 命令将所有异常和事件过滤器的状态重设为默认值。命令被清除、中断和继续选项被重设为默认值,等等。
sx- 命令不改变指定异常或事件的处理状态和中断状态。该命令在希望修改第一次处理机会命令或第二次处理机会命令,而不想修改其他任何东西的时候很有用。
如果包含-h 选项(或指定cc、 hc、bpec或ssec事件),sxe、sxd、sxn和 sxi 命令控制异常或事件的处理状态。在所有其它情况下,这些命令都控制异常或事件的中断状态。
设置中断状态时,这些命令有以下作用。
命令
|
状态名
|
说明
|
sxe
|
Break
(Enabled)
|
当发生该异常时,在任何错误处理器被激活之前目标立即中断到调试器中。这种处理类型称为第一次处理机会。
|
sxd
|
Second chance break
(Disabled)
|
发生该类异常时,调试器不会在第一次处理机会时中断(虽然会显示信息)。如果其他错误处理器没有处理掉该异常,执行会停止下来并中断到调试器。这种处理类型称为第二次处理机会。
|
sxn
|
Output
(Notify)
|
当该异常发生时,目标程序不中断到调试器中。但是,会通过一条消息提示发生了异常。
|
sxi
|
Ignore
|
异常发生时,目标程序不中断到调试器,并且不会显示信息。
|
设置处理状态是,这些命令有以下作用:
命令
|
状态名
|
说明
|
sxe
|
Handled
|
执行返回时,事件被标识为已处理。
|
sxd, sxn, sxi
|
Not Handled
|
执行返回时,事件被标识为未处理。
|
只有异常可以使用-h 选项,而事件不可以。将该选项和ch、 bpe或sse一起使用来分别设置 hc、 bpec或ssec的处理状态。如果将-h 和其他任何事件一起使用,不会有任何效果。
和hc、bpec或ssec一起使用-c 或-c2 选项可以将指定命令分别和ch、bpe或sse关联起来。
下面的例子中,sxe 命令用来设置针对访问违例的第一次处理机会的中断状态,并且设置在第一次处理机会时执行r eax命令。sx- 命令用来将第一次处理机会命令改变为r ebx,而不会改变处理状态。最后,显示了一部分sx的输出,指明了访问违例事件的当前设置:
0:000> sxe -c "r eax" av
0:000> sx- -c "r ebx" av
0:000> sx
av - Access violation - break - not handled
Command: "r ebx"
. . .
附加信息
关于中断状态和处理状态的更多信息、事件代码的说明、所有事件的默认状态列表、以及控制该状态的其他方法,查看控制异常和状态。