Sun Studio 12 Update 1:使用 dbx 调试程序

检查内存的内容

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

可使用 dis 命令和 listi 命令打印汇编命令。(请参见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,它以缺省格式显示下一个地址的内容。

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

0xff99

绝对地址 

main

函数地址 

main+20

与函数地址的偏移 

&errno

变量地址 

str

指向字符串的指针值变量 

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

使用格式

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

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

显示为汇编指令。 

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

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

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

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

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

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

显示为八进制字节。 

显示为字符。 

显示为宽字符。 

显示为以空字节终止的字符串。 

显示为宽字符串。 

显示为单精度浮点数。 

F, g 

显示为双精度浮点数。 

显示为扩展精度浮点数。 

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 为十进制重复计数。增量大小取决于内存显示格式。

使用地址的示例

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

对于基于 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)