Address and Address Range Syntax(Windbg Manual 翻译)

Address and Address Range Syntax

调试器中有多种方法来指定地址。除了在文档中特殊指出来以外,调试器中使用的地址都是虚拟地址。用户模式下调试器根据当前进程的页目录来翻译虚拟地址。在内核模式下, 调试器根据指定进程上下文的页目录来翻译虚拟地址。另外你也可以直接设置用户模式下的地址上下文。更多信息参见(.context)。

Address Modes and Segment Support

在基于X86的平台上,CDB和KD支持以下地址模式,这几个模式通过前缀来区分

PrefixNameAddress Type
%flat32-bit addresses (also 16-bit selectors that point to 32-bit segments) and 64-bit addresses on 64-bit systems.
&

virtual

86

Real-mode addresses. x86-based only.
#plainReal-mode addresses. x86-based only.

plain和virtual 86模式的地址模式的区别是plain 16-bit地址使用段寄存器中的值来作为段选择子来查找段描述符。而virtual 86地址不使用段选择子而是直接映射到低1MB。

如果你当前访问内存使用的地址模式不是默认的模式,可以通过使用地址模式前缀来重写当前的地址模式。

Address Arguments

寻址参数指明了变量和方法的地址。下面表格解释了不同寻址的语法和含义。这些都可以在CDB和KD中使用。

SyntaxMeaning
offset虚拟内存空间中的绝对地址,类型取决于当前的运行模式。例如当前运行模式如果是16bit,则offset是16bit,如果运行模式是基于分段的32bit,则offset就是基于分段的32bit地址。

&[[segment:]]

offset

基于x86和基于x64的是模式地址
%segment:[[offset]]基于段的36bit或64bit地址。 
%[[offset]]在虚拟内存空间中的绝对地址,根据基于x86和x64分别是32bit和64bit.

name[[+|-]]

offset

一个flat的32-bit地址或64-bit地址。name 能够是任意的符号。 offset指定了偏移。offset可以指定为任意一种寻址模式。没有前缀则为默认模式。可以指定+和-偏移。

使用 dg(Display Selector) 命令可以查看段描述符信息。

使用MASM表达式,你可以使用poi运算符给任意指针进行解引用操作。例如如果一个指针的地址为0x0012345, 其指向地址为0x00420000,接下来的两个命令是相等的。

0:000> dd 420000 
0:000> dd poi(123456) 

使用C++表达式,指针的行为类似于C++指针。但是字面量的数字会被解释为整数,而不是一个指针,因此如果要给一个字面量的数字解引用则需要先进行强转,如下所示

0:000> dd *( (long*) 0x123456 ) 

某些伪寄存器会存储一些常用的地址,例如当前程序的计数器地址。

你也可以通过指定一个程序中的源文件中的行号来指明一个内存地址。参考 Source LIne Syntax.

Address Ranges

你可以通过一对地址或者一个地址和对象数量来指明一个内存地址范围。

为了通过一对地址来指定一个范围,需要指定一个起始地址和一个结束地址。例如, 下面指明了从0x00001000开始的8个字节的一段内存地址范围。

0x00001000  0x00001007

为了通过一个地址和对象数量来指定地址范围, 需要指明一个地址参数, 用字符L(大小写不敏感)加一个数值表示。地址指明了内存段的起始地址。而L后数值指明了需要检查或者是显示的对象数量。而对象大字节数依赖于命令本身。例如,对象大小为1字节,则下面例子显示了从0x00001000地址开始的8字节范围的一段内存。

0x00001000  L8

但是如果对象大小是双字(32位或4字节),则下面都分别给出了同样一段8字节大小的内存范围

0x00001000  0x00001007
0x00001000  L2

有另外两种指定L后面值的方法(范围指示器)

  • L? Size 和普通的LSize相同,除了L?Size移除了调试器自动使用的范围限制,一般情况下调试器范围是256M,因为大于这个范围会出现排版错误。如果你需要指定一个大于256MB的地址范围,你就需要使用L?语法。
  • L-Size 指明了Size长度的一段内存,但是是以指定地址作为结束地址。例如,80000000 L20 指定的是0x80000000到0x8000001F。而80000000 L-20 指明的是0x7FFFFFE0到0x7FFFFFFF。

一些命令要求地址范围接受一个单个地址作为参数,这种情况下命令使用某个默认的对象大小来计算内存的范围。典型的情况是命令最后的一个参数是寻址范围命令时就可以使用这种语法。而具体语法以及对象范围大小需要参考各自命令的文档。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值