cc682/NetRoc
http://netroc682.spaces.live.com/
e, ea, eb, ed, eD, ef, ep, eq, eu, ew, eza, ezu (Enter Values)
e*命令在内存中输入指定的值。
该命令不要和~E (Thread-Specific Command)限定符混淆。
语法 eD ef
e{b|d|D|f|p|q|w} Address [Values]
e{a|u|za|zu} Address "String"
e Address [Values]
参数
Address
指定要改写数据的开始位置。调试器替换Address 和之后的每个内存位置,直到所有的Values 都被使用到。
Values
指定要写入内存的一个或多个值。多个数字值之间需要使用空格分隔。如果不指定任何值,则显示指定位置的值,并提示输入数据。
String
指定要写入内存的字符串。ea 和eza 命令会把它作为ASCII字符串写入内存; eu 和ezu 命令会把它作为Unicode字符串写入内存。eza 和ezu 命令会写入结尾的NULL字符;ea 和eu 命令不会。String 必须用引号括起来。
环境
模式
|
用户模式、内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令存在以下这些形式。ed 和eD 命令的第二个字符区分大小写。
命令
|
输入
|
e
|
输入数据的格式和前一次e* 命令一样。(如果上一次的e*命令是ea、eza、eu或ezu,则最后一个参数是String并且不能省略。
|
ea
|
ASCII 字符串(不以NULL结尾)。
|
eb
|
字节值。
|
ed
|
双字值(4字节)。
|
eD
|
双精度浮点数(8字节)。
|
ef
|
单精度浮点数(4字节)。
|
ep
|
指针大小的值。该命令根据目标机的处理器架构是32位还是64位,可能分别等于ed 或eq。
|
eq
|
4字值(8字节)。
|
eu
|
Unicode字符串(非NULL结尾)。
|
ew
|
字值(2字节)。
|
eza
|
NULL结尾的ASCII字符串。
|
ezu
|
NULL结尾的Unicode字符串。
|
数字值会以当前基数(16、10,或者8)进行解析。使用n (Set Number Base) 命令来改变默认基数。默认基数可以通过指定0x(16进制)、0n (10进制)、0t (8进制)或0y (2进制)前缀来覆盖。
注意 使用C++ 表达式时默认基数的行为有所不同。查看表达式求值获取详细信息。
使用eb命令输入字节值时,可以通过单引号来指定字符。如果想包含多个字符,每个都必须单独用单引号包含。这样可以输入非null结尾的字符串。例如:
eb 'h' 'e' 'l' 'l' 'o'
这些命令中不能使用C形式的转义字符(如'\0' 或'\n')。
如果省略Values 参数,会提示进行输入。指定的地址和它的内容会显示出来,并且出现Input> 提示符。这时可以进行如下这些操作:
- 通过键入值和ENTER键来输入新的值。
- 通过按下SPACE然后按下ENTER来保持内存的当前值。
- 按下ENTER来退出当前命令。
附加信息
内存操作的概述和内存相关命令,查看读写内存。
f, fp (Fill Memory)
f 和fp命令使用一个重复的模板来填充指定内存。
注意该命令不要和~F (Freeze Thread)命令混淆。
语法
f Range Pattern
fp [MemoryType] PhysicalRange Pattern
参数
Range
指定要填充的虚拟内存区域。该语法的详细信息,查看地址和地址区域语法。
PhysicalRange
(仅内核模式) 指定要填充的物理内存区域。除了不能指定符号名之外,PhysicalRange 的语法和虚拟内存区域一样。
MemoryType
(仅内核模式) 指定物理内存的种类,可以是下面这些之一:
[c]
缓存的内存(Cached memory)。
[uc]
非缓存的内存(Uncached memory)。
[wc]
写聚合内存(Write-combined memory)。
Pattern
指定用于填充内存的一个或多个字节值。
环境
模式
|
f: 用户模式、内核模式 fp: 仅内核模式
|
目标
|
活动目标、崩溃转储
|
平台
|
所有
|
注释
该命令使用指定的pattern 重复尽可能多次来填充range 指定的内存区域。
pattern 参数必须输入一个字节序列。可以输入数字或ASCII字符。
数字值会以当前基数(16、10或者8)进行解析。使用n (Set Number Base) 命令来改变默认基数。默认基数可以通过指定0x(16进制)、0n (10进制)、0t (8进制)或0y (2进制)前缀来覆盖。
注意 使用C++ 表达式时默认基数的行为有所不同。查看表达式求值获取详细信息。
如果使用ASCII字符,每个字符都需要用单引号括起来。不能使用C风格的转义字符(如 '\0' 或'\n')。
如果指定多个字节,它们之间必须用空格分隔。
如果pattern 比指定的范围包含的字节数多,则调试器忽略多余的值。
这里有一些例子。假设当前基数为16,下面的命令将从0012FF40 到0012FF5F 的内存用模板"ABC"重复数次来填充:
0:000> f 0012ff40 L20 'A' 'B' 'C'
下面的命令有相同作用:
0:000> f 0012ff40 L20 41 42 43
下面的例子说明如何与fp命令一起使用不同的物理内存种类c、uc和wc(内核模式):
?: kd> fp c 0012ff40 L20 'A' 'B' 'C'
?: kd> fp uc 0012ff40 L20 'A' 'B' 'C'
?: kd> fp wc 0012ff40 L20 'A' 'B' 'C'
附加信息
内存操作的概述和内存相关命令,查看读写内存。
g (Go)
g 命令开始指定进程或线程的执行。这种执行将会在程序结束、遇到BreakAddress 或者其他造成调试器停止的事件发生时停止。
语法
用户模式语法
[~Thread] g[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
内核模式语法
g[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
参数
Thread
(仅用户模式) 指定要执行的线程。语法的详细信息,查看线程语法。
a
使得任何用该命令创建的断点成为处理器断点(就像用ba创建的一样) ,而不是软断点(像用bp 和 bm创建的一样)。如果没有指定BreakAddress,则不会创建断点并且a标志无效。
StartAddress
指定要开始执行的地址。如果没有指定,调试器将执行传递给指令计数器的当前值所指向的地址。语法的详细信息,查看地址和地址范围语法。
BreakAddress
指定断点的地址。如果设置了BreakAddres,它必须是一个指令地址(即该地址必须是某条指令第一个字节的地址)。一次可以以任意顺序设置最多10个断点地址。如果BreakAddress 还未能确定,它将被作为未定断点保存起来。语法的详细信息,查看地址和地址范围语法。
BreakCommands
指定当遇到BreakAddress 设置的断点时要自动执行的命令。BreakCommands 参数必须以一个分号开头。如果指定了多个BreakAddress值,BreakCommands 会应用到每一个上。
注意 BreakCommands 参数仅在包含在其他命令的命令字符串中时可用 — 例如,在另一个断点命令或异常或事件的设置中。在一个命令行上,分号会结束g命令,并且在分号后列出的任何其他命令会在g命令完成后立即执行。
环境
模式
|
用户模式、内核模式
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
如果指定了Thread,则g命令使得指定线程非冻结,而冻结所有其他线程。例如,如果指定~123g、 ~#g或~*g命令,指定的线程不被冻结,而其他所有线程都会被冻结。
附加信息
关于其他执行该命令的方法和相关命令的概述,查看控制调试目标。
gc (Go from Conditional Breakpoint)
gc 命令使用和遇到断点时一样的方式(单步、跟踪或自由执行)来从一个条件断点恢复执行。
语法
gc
环境
模式
|
用户模式、内核模式
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
当一个条件断点的末尾包含一个执行命令时,需要使用gc命令。
例如,下面是一个正确的条件断点命令:
0:000> bp Address "j (Condition) 'OptionalCommands'; 'gc' "
当遇到该断点并且表达式为false时,恢复执行会使用前一次相同的执行类型。例如,如果使用g (Go)命令来到达该断点,则恢复为自由执行。但是如果使用单步或跟踪来到达该断点,也会以单步或跟踪的方式来恢复执行。
换句话说,下面是一个不正确的断点设置,因为即使单步执行到该断点,也总是会变成自由执行:
0:000> bp Address "j (Condition) 'OptionalCommands'; 'g' "
附加信息
相关命令的概述,查看控制调试目标。
gh (Go with Exception Handled)
gh命令将给定线程的异常标识为已处理,并且允许该线程从产生异常的指令继续执行。
语法
用户模式语法
[~Thread] gh[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
内核模式语法
gh[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
参数
Thread
(仅用户模式) 指定要执行的线程。该线程必须是因为异常而停止的。详细信息查看线程语法。
a
使得任何用该命令创建的断点成为处理器断点(就像用ba创建的一样) ,而不是软断点(像用bp 和 bm创建的一样)。如果没有指定BreakAddress,则不会创建断点并且a标志无效。
StartAddress
指定要开始执行的地址。如果没有指定,调试器将执行传递给指令计数器的当前值所指向的地址。语法的详细信息,查看地址和地址范围语法。
BreakAddress
指定断点的地址。如果设置了BreakAddres,它必须是一个指令地址(即该地址必须是某条指令第一个字节的地址)。一次可以以任意顺序设置最多10个断点地址。如果BreakAddress 还未能确定,它将被作为未定断点保存起来。语法的详细信息,查看地址和地址范围语法。
BreakCommands
指定当遇到BreakAddress 设置的断点时要自动执行的命令。BreakCommands 参数必须以一个分号开头。如果指定了多个BreakAddress值,BreakCommands 会应用到每一个上。
注意 BreakCommands 参数仅在将它包含在另一个命令的命令字符串中时可用 — 例如,在另一条断点命令或一个异常或事件设置中。在一个命令行中,分号会结束gh命令,并且分号之后的所有附加命令会在gh完成之后立即执行。
环境
模式
|
用户模式、内核模式
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
如果使用BreakAddress 参数来设置断点,该断点只会在当前线程触发。其他线程执行到指定的代码位置时不会停止下来。
如果指定了Thread ,gh 命令将指定线程解冻并冻结其他所有线程然后再执行。例如,如果使用~123gh、~#gh或~*gh命令,指定线程会是解冻的,而其他所有线程都被冻结。
附加信息
关于其他执行该命令的方法和相关命令的概述,查看控制调试目标。
gn, gN (Go with Exception Not Handled)
gn和gN 命令继续给定线程的执行,但是不将异常标记为已处理。这样使得应用程序的异常处理器可以处理该异常。
语法
用户模式语法
[~Thread] gn[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
[~Thread] gN[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
内核模式语法
gn[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
gN[a] [= StartAddress] [BreakAddress ... [; BreakCommands]]
参数
Thread
(仅用户模式) 指定要执行的线程。该线程必须是因为异常而停止下来的。语法的详细信息,查看线程语法。
a
使得任何用该命令创建的断点成为处理器断点(就像用ba创建的一样) ,而不是软断点(像用bp 和 bm创建的一样)。如果没有指定BreakAddress,则不会创建断点并且a标志无效。
StartAddress
指定要开始执行的地址。如果没有指定,调试器将执行传递给指令计数器的当前值所指向的地址。语法的详细信息,查看地址和地址范围语法。
BreakAddress
指定断点的地址。如果设置了BreakAddres,它必须是一个指令地址(即该地址必须是某条指令第一个字节的地址)。一次可以以任意顺序设置最多10个断点地址。如果BreakAddress 还未能确定,它将被作为未定断点保存起来。语法的详细信息,查看地址和地址范围语法。
BreakCommands
指定当遇到BreakAddress 设置的断点时要自动执行的命令。BreakCommands 参数必须以一个分号开头。如果指定了多个BreakAddress值,BreakCommands 会应用到每一个上。
注意 BreakCommands 参数仅在将它包含在另一个命令的命令字符串中时可用 — 例如,在另一条断点命令或一个异常或事件设置中。在一个命令行中,分号会结束该命令,并且分号之后的所有附加命令会在gn 或gN完成之后立即执行。
环境
模式
|
用户模式、内核模式
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
如果调试器不是在一个断点上停下来的,gn 和gN 的作用相同。如果调试器是在断点上停下来的,则gn无效;必须 使用大写的"N"才能执行该命令。这是一个安全性上的预防措施,因为极少会在不处理断点的情况下继续执行的。
如果使用BreakAddress 参数来设置断点,该断点只会在当前线程触发。其他线程执行到指定的代码位置时不会停止下来。
如果指定了Thread ,gn 命令将指定线程解冻并冻结其他所有线程然后再执行。例如,如果使用~123gn、~#gn或~*gn命令,指定线程会是解冻的,而其他所有线程都被冻结。
附加信息
关于其他执行该命令的方法和相关命令的概述,查看控制调试目标。
gu (Go Up)
gu命令使得目标继续执行直到当前函数完成。
语法
用户模式语法
[~Thread] gu
内核模式语法
gu
参数
Thread
(仅用户模式) 指定要执行的线程。该线程必须是因为异常而停止下来的。语法的详细信息,查看线程语法。
环境
模式
|
用户模式、内核模式
|
目标
|
仅活动调试
|
平台
|
所有
|
注释
gu 命令执行目标,直到当前函数调用返回。
如果当前函数是递归调用的,gu 在当前函数的当前实例(current instance)返回之前不会停止目标的执行。这时,gu和g @$ra不同,后者会在每次运行到该函数的返回地址时中断。
注意 gu 命令通过测量调用堆栈的深度来区分不同的函数调用的实例。在汇编模式下,应该在参数入栈之后,任何可能造成这种测量不正确的操作之前执行该命令。函数的返回被编译器优化到其他位置的话,可能也会造成该命令在错误的实例返回时停止。这些错误是很少见的,并且只会在函数的递归调用时出现。
如果指定了Thread ,gu 命令将指定线程解冻并冻结其他所有线程然后再执行。例如,如果使用~123gu、~#gu或~*gu命令,指定线程会是解冻的,而其他所有线程都被冻结。
附加信息
关于其他执行该命令的方法和相关命令的概述,查看控制调试目标。