NetRoc's Blog

N-Tech

 

WinDbg 文档翻译----51

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|wAddress [Values
e{a|u|za|zuAddress "String" 
e Address [Values

参数

Address

指定要改写数据的开始位置。调试器替换Address 和之后的每个内存位置,直到所有的Values 都被使用到。

Values

指定要写入内存的一个或多个值。多个数字值之间需要使用空格分隔。如果不指定任何值,则显示指定位置的值,并提示输入数据。

String

指定要写入内存的字符串。eaeza 命令会把它作为ASCII字符串写入内存; euezu 命令会把它作为Unicode字符串写入内存。ezaezu 命令会写入结尾的NULL字符;eaeu 命令不会。String 必须用引号括起来。

环境

模式

用户模式、内核模式

目标

活动目标、崩溃转储

平台

所有

 

注释

该命令存在以下这些形式。edeD 命令的第二个字符区分大小写。

命令

输入

e

输入数据的格式和前一次e* 命令一样。(如果上一次的e*命令是eaezaeuezu,则最后一个参数是String并且不能省略。

ea

ASCII 字符串(不以NULL结尾)。

eb

字节值。

ed

双字值(4字节)。

eD

双精度浮点数(8字节)。

ef

单精度浮点数(4字节)。

ep

指针大小的值。该命令根据目标机的处理器架构是32位还是64位,可能分别等于edeq

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)

ffp命令使用一个重复的模板来填充指定内存。

注意该命令不要和~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命令一起使用不同的物理内存种类cucwc(内核模式):

?: 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 或者其他造成调试器停止的事件发生时停止。

语法

用户模式语法

[~Threadg[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 

内核模式语法

g[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 



参数

Thread

(仅用户模式) 指定要执行的线程。语法的详细信息,查看线程语法

a

使得任何用该命令创建的断点成为处理器断点(就像用ba创建的一样) ,而不是软断点(像用bpbm创建的一样)。如果没有指定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命令将给定线程的异常标识为已处理,并且允许该线程从产生异常的指令继续执行。

语法

用户模式语法

[~Threadgh[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 

内核模式语法

gh[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 



参数

Thread

(仅用户模式) 指定要执行的线程。该线程必须是因为异常而停止的。详细信息查看线程语法

a

使得任何用该命令创建的断点成为处理器断点(就像用ba创建的一样) ,而不是软断点(像用bpbm创建的一样)。如果没有指定BreakAddress,则不会创建断点并且a标志无效。

StartAddress

指定要开始执行的地址。如果没有指定,调试器将执行传递给指令计数器的当前值所指向的地址。语法的详细信息,查看地址和地址范围语法

BreakAddress

指定断点的地址。如果设置了BreakAddres,它必须是一个指令地址(即该地址必须是某条指令第一个字节的地址)。一次可以以任意顺序设置最多10个断点地址。如果BreakAddress 还未能确定,它将被作为未定断点保存起来。语法的详细信息,查看地址和地址范围语法

BreakCommands

指定当遇到BreakAddress 设置的断点时要自动执行的命令。BreakCommands 参数必须以一个分号开头。如果指定了多个BreakAddress值,BreakCommands 会应用到每一个上。

注意  BreakCommands 参数仅在将它包含在另一个命令的命令字符串中时可用 — 例如,在另一条断点命令或一个异常或事件设置中。在一个命令行中,分号会结束gh命令,并且分号之后的所有附加命令会在gh完成之后立即执行。

环境

模式

用户模式、内核模式

目标

仅活动调试

平台

所有

 

注释

如果使用BreakAddress 参数来设置断点,该断点只会在当前线程触发。其他线程执行到指定的代码位置时不会停止下来。

如果指定了Threadgh 命令将指定线程解冻并冻结其他所有线程然后再执行。例如,如果使用~123gh~#gh~*gh命令,指定线程会是解冻的,而其他所有线程都被冻结。

附加信息

关于其他执行该命令的方法和相关命令的概述,查看控制调试目标

gn, gN (Go with Exception Not Handled)

gngN 命令继续给定线程的执行,但是不将异常标记为已处理。这样使得应用程序的异常处理器可以处理该异常。

语法

用户模式语法

[~Threadgn[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 
[~ThreadgN[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 

内核模式语法

gn[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 
gN[a] [= StartAddress] [BreakAddress ... [; BreakCommands]] 



参数

Thread

(仅用户模式) 指定要执行的线程。该线程必须是因为异常而停止下来的。语法的详细信息,查看线程语法

a

使得任何用该命令创建的断点成为处理器断点(就像用ba创建的一样) ,而不是软断点(像用bpbm创建的一样)。如果没有指定BreakAddress,则不会创建断点并且a标志无效。

StartAddress

指定要开始执行的地址。如果没有指定,调试器将执行传递给指令计数器的当前值所指向的地址。语法的详细信息,查看地址和地址范围语法

BreakAddress

指定断点的地址。如果设置了BreakAddres,它必须是一个指令地址(即该地址必须是某条指令第一个字节的地址)。一次可以以任意顺序设置最多10个断点地址。如果BreakAddress 还未能确定,它将被作为未定断点保存起来。语法的详细信息,查看地址和地址范围语法

BreakCommands

指定当遇到BreakAddress 设置的断点时要自动执行的命令。BreakCommands 参数必须以一个分号开头。如果指定了多个BreakAddress值,BreakCommands 会应用到每一个上。

注意  BreakCommands 参数仅在将它包含在另一个命令的命令字符串中时可用 — 例如,在另一条断点命令或一个异常或事件设置中。在一个命令行中,分号会结束命令,并且分号之后的所有附加命令会在gngN完成之后立即执行。

环境

模式

用户模式、内核模式

目标

仅活动调试

平台

所有

 

注释

如果调试器不是在一个断点上停下来的,gngN 的作用相同。如果调试器是在断点上停下来的,则gn无效;必须 使用大写的"N"才能执行该命令。这是一个安全性上的预防措施,因为极少会在不处理断点的情况下继续执行的。

如果使用BreakAddress 参数来设置断点,该断点只会在当前线程触发。其他线程执行到指定的代码位置时不会停止下来。

如果指定了Threadgn 命令将指定线程解冻并冻结其他所有线程然后再执行。例如,如果使用~123gn~#gn~*gn命令,指定线程会是解冻的,而其他所有线程都被冻结。

附加信息

关于其他执行该命令的方法和相关命令的概述,查看控制调试目标

gu (Go Up)

gu命令使得目标继续执行直到当前函数完成。

语法

用户模式语法

[~Threadgu 

内核模式语法

gu 

参数

Thread

(仅用户模式) 指定要执行的线程。该线程必须是因为异常而停止下来的。语法的详细信息,查看线程语法

环境

模式

用户模式、内核模式

目标

仅活动调试

平台

所有

 

注释

gu 命令执行目标,直到当前函数调用返回。

如果当前函数是递归调用的,gu 在当前函数的当前实例(current instance)返回之前不会停止目标的执行。这时,gug @$ra不同,后者会在每次运行到该函数的返回地址时中断。

注意  gu 命令通过测量调用堆栈的深度来区分不同的函数调用的实例。在汇编模式下,应该在参数入栈之后,任何可能造成这种测量不正确的操作之前执行该命令。函数的返回被编译器优化到其他位置的话,可能也会造成该命令在错误的实例返回时停止。这些错误是很少见的,并且只会在函数的递归调用时出现。

如果指定了Threadgu 命令将指定线程解冻并冻结其他所有线程然后再执行。例如,如果使用~123gu~#gu~*gu命令,指定线程会是解冻的,而其他所有线程都被冻结。

附加信息

关于其他执行该命令的方法和相关命令的概述,查看控制调试目标

posted on 2008-06-16 11:47 NetRoc 阅读(362) 评论(0)  编辑 收藏 引用

只有注册用户登录后才能发表评论。

导航

统计

常用链接

留言簿(7)

随笔档案(99)

文章分类(35)

文章档案(32)

Friends

Mirror

搜索

最新评论

阅读排行榜

评论排行榜