可使用地址以及 examine 或 x 命令检查内存位置的内容及打印每个地址处的汇编语言指令。使用从 adb(1)(汇编语言调试器)派生的命令,可以查询:
address,使用 =(等号)字符,或
某地址处存储的内容,使用 /(斜线)字符。
可使用 dis 命令和 listi 命令打印汇编命令。(请参见dis 命令用法和listi 命令用法。)
可使用 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 命令等同于以 i 作为缺省显示格式的 examine 命令。
dis 命令的语法如下。
dis [address] [address1, address2] [/count] |
dis 命令:
不使用参数时显示以 + 开始的 10 个指令。
只使用 address 参数时,反汇编始于 address 的 10 个指令。
使用 address 参数和 count 时,反汇编始于 address 的 count 个指令。
使用 address1 和 address2 参数时,反汇编从 address1 到 address2 的指令。
只使用 count 时,显示始于 + 的 count 个指令。
要显示源代码行及其对应的汇编指令,请使用 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) |