可使用地址以及 examine 或 x 命令检查内存位置的内容及输出每个地址处的汇编语言指令。使用从 adb(1)(汇编语言调试器)派生的命令,可以查询以下内容:
address(地址),使用 =(等号)字符
某地址处存储的 contents(内容),使用 /(斜线)字符
可使用 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 可以替换为 +(加号),该符号以缺省格式显示下一个地址的内容。
以下示例为有效地址:
|
用于显示内存的符号地址的名称前有和号 (&)。使用函数名称时不必带有和符号;&main 等效于 main。寄存器名称前有美元符号 ($)。
该格式为 dbx 显示查询结果的地址显示格式。 生成的输出取决于当前显示格式。要更改显示格式,应提供不同的格式代码。
在每个 dbx 会话的开始处设置的缺省格式为 X,该格式将地址或值显示为十六进制 32 位字。 以下内存显示格式合法:
|
该计数是以十进制表示的重复计数。增量大小取决于内存显示格式。
以下示例说明如何使用地址和格式选项来显示从当前停止点开始的五个连续反汇编指令。
对于基于 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>] [/<count>] | <address1>, <address1>
dis 命令操作如下:
不使用参数时显示以 address 开始的 10 个指令
只使用 address 参数时,反汇编始于 address 的 10 个指令
使用 address 参数和 count,反汇编 count 个始于 address 的指令
使用 address1 和 address2 参数,反汇编 address1 到 address2 的指令
仅使用 count,显示从 + 开始的 count 条指令
使用 –a 选项时,反汇编整个函数,如果使用时不带参数,则反汇编当前访问函数的剩余部分
要显示源代码行及其对应的汇编指令,请使用 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)