Oracle® Developer Studio 12.5:使用 dbx 调试程序

退出打印视图

更新时间: 2016 年 6 月
 
 

检查内存的内容

可使用地址以及 examinex 命令检查内存位置的内容及输出每个地址处的汇编语言指令。使用从 adb(1)(汇编语言调试器)派生的命令,可以查询以下内容:

  • address(地址),使用 =(等号)字符

  • 某地址处存储的 contents(内容),使用 /(斜线)字符

可使用 dis 命令和 listi 命令输出汇编命令。

examinex 命令用法

可使用 examine 命令或其别名 x 显示内存内容或地址。

下列语法用于以 format 格式显示始于 addresscount 项内存内容。缺省的 address 为先前显示的最后一个地址后的下一个地址。缺省 count 为 1。缺省 format 与在先前的 examine 命令中使用的相同;如果这是给出的第一个命令,则为 X

examine 命令的语法如下:

examine [address] [/ [count] [format]]

要以 format 格式显示 address1address2(首末地址包含在内)的内存内容:

examine address1, address2 [/ [format]]

要以指定格式显示地址(而不是地址的内容):

examine address = [format]

要输出存储在 examine 显示的最后一个地址之后的下一个地址中的值:

examine +/ i

要输出表达式的值,请提供表达式作为地址。

examine address=format
examine address=

使用地址

address 是求值结果为地址或可用作地址的任何表达式。address 可以替换为 +(加号),该符号以缺省格式显示下一个地址的内容。

以下示例为有效地址:

0xff00
绝对地址
main
函数地址
main+20
与函数地址的偏移
&errno
变量地址
str
指向字符串的指针值变量

用于显示内存的符号地址的名称前有和号 (&)。使用函数名称时不必带有和符号;&main 等效于 main。寄存器名称前有美元符号 ($)。

使用格式

该格式为 dbx 显示查询结果的地址显示格式。 生成的输出取决于当前显示格式。要更改显示格式,应提供不同的格式代码。

在每个 dbx 会话的开始处设置的缺省格式为 X,该格式将地址或值显示为十六进制 32 位字。 以下内存显示格式合法:

i
显示为汇编指令
d
显示为十进制 16 位(2 字节)
D
显示为十进制 32 位(4 字节)
o
显示为八进制 16 位(2 字节)
O
显示为八进制 32 位(4 字节)
x
显示为十六进制 16 位(2 字节)
X
显示为十六进制 32 位(4 字节)(缺省格式)
b
显示为八进制字节
c
显示为字符
n
显示为十进制(1 字节)。
w
显示为宽字符
s
显示为以空字节终止的字符串
W
显示为宽字符串
f
显示为单精度浮点数
F, g
显示为双精度浮点数
E
显示为扩展精度浮点数
ld, lD
显示为十进制 32 位(4 字节)(与 D 相同)
lo, lO
显示为八进制 32 位(4 字节)(与 O 相同)
lx, LX
显示为十六进制 32 位(4 字节)(与 X 相同)
Ld, LD
显示为十进制 64 位(8 字节)
Lo, LO
显示为八进制 64 位(8 字节)
Lx, LX
显示为十六进制 64 位(8 字节)

使用计数

该计数是以十进制表示的重复计数。增量大小取决于内存显示格式。

使用地址的示例

以下示例说明如何使用地址和格式选项来显示从当前停止点开始的五个连续反汇编指令。

对于基于 SPARC 的系统:

(dbx) stepi
stopped in main at 0x108bc
0x000108bc: main+0x000c: st    %l0, [%fp - 0x14]
(dbx) x 0x108bc/5i
0x000108bc: main+0x000c: st    %l0, [%fp - 0x14]
0x000108c0: main+0x0010: mov   0x1,%l0
0x000108c4: main+0x0014: or    %l0,%g0, %o0
0x000108c8: main+0x0018: call  0x00020b90 [unresolved PLT 8: malloc]
0x000108cc: main+0x001c: nop

对于基于 x86 的系统:

(dbx) x &main/5i
0x08048988: main       :  pushl  %ebp
0x08048989: main+0x0001:  movl   %esp,%ebp
0x0804898b: main+0x0003:  subl   $0x28,%esp
0x0804898e: main+0x0006:  movl   0x8048ac0,%eax
0x08048993: main+0x000b:  movl   %eax,-8(%ebp)

dis 命令用法

dis 命令等同于以 i 作为缺省显示格式的 examine 命令。

dis 命令的语法为:

dis [<address>] [/<count>] | <address1>, <address1>

    dis 命令操作如下:

  • 不使用参数时显示以 address 开始的 10 个指令

  • 只使用 address 参数时,反汇编始于 address 的 10 个指令

  • 使用 address 参数和 count,反汇编 count 个始于 address 的指令

  • 使用 address1address2 参数,反汇编 address1address2 的指令

  • 仅使用 count,显示从 + 开始的 count 条指令

  • 使用 –a 选项时,反汇编整个函数,如果使用时不带参数,则反汇编当前访问函数的剩余部分

listi 命令用法

要显示源代码行及其对应的汇编指令,请使用 listi 命令,该命令等效于 list -i 命令。请参见输出源代码列表 中有关 list -i 的讨论。

基于 SPARC 的系统示例:

(dbx) listi 13, 14
   13       i = atoi(argv[1]);
0x0001083c: main+0x0014:  ld      [%fp + 0x48], %l0
0x00010840: main+0x0018:  add     %l0, 0x4, %l0
0x00010844: main+0x001c:  ld      [%l0], %l0
0x00010848: main+0x0020:  or      %l0, %g0, %o0
0x0001084c: main+0x0024:  call    0x000209e8 [unresolved PLT 7: atoi]
0x00010850: main+0x0028:  nop
0x00010854: main+0x002c:  or      %o0, %g0, %l0
0x00010858: main+0x0030:  st      %l0, [%fp - 0x8]
   14       j = foo(i);
0x0001085c: main+0x0034:  ld      [%fp - 0x8], %l0
0x00010860: main+0x0038:  or      %l0, %g0, %o0
0x00010864: main+0x003c:  call    foo
0x00010868: main+0x0040:  nop
0x0001086c: main+0x0044:  or      %o0, %g0, %l0
0x00010870: main+0x0048:  st      %l0, [%fp - 0xc]

基于 x86 的系统示例:

(dbx) listi 13, 14
   13       i = atoi(argv[1]);
0x080488fd: main+0x000d:  movl   12(%ebp),%eax
0x08048900: main+0x0010:  movl   4(%eax),%eax
0x08048903: main+0x0013:  pushl  %eax
0x08048904: main+0x0014:  call   atoi <0x8048798>
0x08048909: main+0x0019:  addl   $4,%esp
0x0804890c: main+0x001c:  movl   %eax,-8(%ebp)
   14       j = foo(i);
0x0804890f: main+0x001f:  movl   -8(%ebp),%eax
0x08048912: main+0x0022:  pushl  %eax
0x08048913: main+0x0023:  call   foo <0x80488c0>
0x08048918: main+0x0028:  addl   $4,%esp
0x0804891b: main+0x002b:  movl   %eax,-12(%ebp)