Oracle Solaris Studio 12.2:使用 dbx 调试程序

检查内存的内容

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

可使用 dis 命令和 listi 命令输出汇编命令。(请参见dis 命令用法和listi 命令用法。)

examine 或 x 命令用法

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

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

examine 命令的语法如下:


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

要以 format 格式显示 address1 到 address2(首末地址包含在内)的内存内容,请键入:


examine address1, address2 [/ [format]]

要以给定格式显示地址而不是地址内容,请键入:


examine address = [format]

要输出 examine 最后显示的地址后的下一个地址处存储的值,请键入:


examine +/ i

要输出表达式的值,请以地址形式输入表达式:


examine address=format
examine address=

使用地址

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

例如,下面所示都是有效地址:

0xff99

绝对地址 

main

函数地址 

main+20

与函数地址的偏移 

&errno

变量地址 

str

指向字符串的指针值变量 

用于显示内存的符号地址的名称前有和号 (&)。函数名称前可以不带和号,例如,&main 等同于 main。寄存器名称前有美元符号 ($)。

使用格式

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

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

i 

显示为汇编指令。 

d 

显示为十进制 16 位(2 字节)。 

D 

显示为十进制 32 位(4 字节)。 

o 

显示为八进制 16 位(2 字节)。 

O 

显示为八进制 32 位(4 字节)。 

x 

显示为十六进制 16 位(2 字节)。 

X 

显示为十六进制 32 位(4 字节)。(缺省格式) 

b 

显示为八进制字节。 

c 

显示为字符。 

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 字节)。 

使用计数

count 为十进制重复计数。增量大小取决于内存显示格式。

使用地址的示例

下面的示例说明如何使用地址以及 count 和 format 选项来显示始于当前停止点的五个连续的反汇编指令。

对于基于 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] [address1, address2] [/count]

dis 命令:

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)