定制 adb 调试程序

此部分描述了如何定制 adb 调试程序。

将多个命令合并到一行

可通过将命令用 ;(分号)分隔的方法在一行上给出多个命令。 一次只执行一条命令,执行顺序是从左边开始。 对当前地址和格式的更改将延迟到下一条命令。 如果出错,那么忽略剩余命令。 例如:以下序列显示 adb 变量以及 adbsamp2 程序中某一点处的活动子例程:

$v;$c
variables
b = 10000000
d = ec
e = 10000038
m = 108
t = 2f8.
f(0,0) .main+26.
main(0,0,0) start+fa

创建 adb 脚本

启动 adb 程序时,可通过重定向标准输入文件指示 adb 调试程序从文本文件而不是从键盘读取命令。 要重定向标准输入,请使用输入重定向符号 <(小于),并提供文件名。 例如,使用以下命令从文件脚本读取命令:

adb sample <script

文件必须包含有效 adb 子命令。 当可将同组命令用于若干不同对象文件时,使用 adb 程序脚本文件。 脚本可在程序出错后显示核心文件的内容。 以下示例显示包含一些命令的文件,这些命令显示有关程序错误的信息。 将该文件用作使用以下命令调试 adbsamp2 文件的 adb 程序的输入时,指定输入也就产生了。

120$w
4095$s.
f:b:
r
=1n"======= adb Variables ======="
$v
=1n"======= Address Map ======="
$m
=1n"======= C Stack Backtrace ======="
$C
=1n"======= C External Variables ======="
$e
=1n"======= Registers ======="
$r
0$s
=1n"======= Data Segment ======="<
b,10/8xna
$ adb adbsamp2 <script
adbsamp2: running
breakpoint .f:   b  .f+24
    ======= adb Variables =======
variables
0 = TBD
1 = TBD
2 = TBD
9 = TBD
b = 10000000
d = ec
e = 10000038
m = 108
t = 2f8
    ======= Address Map =======
[0]? map  .adbsamp2.
b1 = 10000000  e1 = 100002f8  f1 = 0
b2 = 200002f8  e2 = 200003e4  f2 = 2f8
[0]/ map  .-.
b1 = 0    e1 = 0    f1 = 0
b2 = 0    e2 = 0    f2 = 0
    ======= C Stack Backtrace =======.
f(0,0) .main+26.
main(0,0,0) start+fa
    ======= C External Variables =======Full word.
errno: 0.
environ:  3fffe6bc.
NLinit:  10000238.
main: 100001ea.
exit: 1000028c.
fcnt: 0
.loop .count:  1.
f:   100001b4.
NLgetfile: 10000280.
write: 100002e0.
NLinit. .X:  10000238 .
NLgetfile. .X:   10000280 .
cleanup: 100002bc.
exit: 100002c8 .
exit . .X:  1000028c . .
cleanup . .X:  100002bc
    ======= Registers =======
mq  20003a24  .errno+3634
cs  100000 gt
ics  1000004
pc  100001b4 .f
r15  10000210 .main+26
r14  20000388  .main
r13  200003ec  .loop .count
r12  3fffe3d0
r11  3fffe44c
r10  0
r9  20004bcc
r8  200041d8  .errno+3de8
r7  0
r6  200030bc  .errno+2ccc
r5  1
r4  200003ec  .loop .count
r3  f4240
r2  1
r1  3fffe678
r0  20000380  .f.
f:   b  .f+24
    ======= Data Segment =======
10000000:  103 5313  3800  0  0  2f8 0  ec
10000010:  0  10 1000  38 0  0  0  1f0
10000020:  0  0  0  0  1000  0  2000  2f8
10000030:  0  0  0  0  4  6000  0  6000
10000040:  6e10  61d0  9430  a67 6730  6820  c82e  8
10000050:  8df0  94 cd0e  60 6520  a424  a432  c84e
10000060:  8  8df0  77 cd0e  64 6270  8df0  86
10000070:  cd0e  60 6520  a424  a432  6470  8df0  6a
10000080:  cd0e  64 c82e  19 8df0  78 cd0e  60
10000090:  6520  a424  a432  c84e  19 8df0  5b cd0e
100000a0:  64 cd2e  5c 7022  d408  64 911 c82e
100000b0:  2e 8df0  63 cd0e  60 6520  a424  a432
100000c0:  c84e  2e 8df0  46 cd0e  64 15 6280
100000d0:  8df0  60 cd0e  68 c82e  3f 8df0  4e
100000e0:  cd0e  60 6520  a424  a432  c84e  3f 8df0
100000f0:  31 cd0e  64 c820  14 8df0  2b cd0e
10000100:

设置输出宽度

使用 $w 子命令设置 adb 程序创建的每一行输出的最大宽度(以字符计)。 命令格式为:

宽度$w

在此格式中,Width 参数为以显示器字符指定宽度的整数。 可为显示设备给定任何宽度约定。 首次调用 adb 程序时,缺省宽度为 80 个字符。

将输出重定向到行式显示机或特殊输出设备时可使用此命令。 例如,以下命令集将显示器宽度设为 120 个字符,这通常是行式显示机的最大宽度:

120$w

设置最大偏移量

adb 调试程序通常将内存和文件地址显示为符号和偏移量的总和。 这种格式有助于将显示器上的指令和数据与特殊函数或变量关联。 启动 adb 程序时,它将最大偏移量设为 255,这样就会将符号地址仅分配给从函数或变量的起始位置算起小于 256 字节的指令或数据。 将数字地址赋予超出该点的指令或数据。

在许多程序中,函数或变量的大小实际上大于 255 个字节。 因此,adb 程序允许您更改最大偏移量从而容纳更大的程序。 可使用 $s 子命令更改最大偏移量。

子命令格式为:

偏移量

在此格式中,Offset 参数为指定新偏移量的整数。 例如,以下命令将可能的最大偏移量增加到 4095:

4095$s

将符号地址赋予所有小于 4096 字节的指令和数据。 可通过将最大偏移量设为 0 来禁用所有符号寻址。 取而代之以数字值赋予所有地址。

设置缺省输入格式

要改变命令中使用的数字的缺省格式,请使用 $d$o(八进制)子命令。 缺省格式告诉 adb 调试程序如何解释不以 0(八进制)或 0x(十六进制)开头的数字,以及如果在不指定特定格式时显示数字。 使用这些命令来处理十进制、八进制和十六进制数字的组合。

$o 子命令将基数设为 8,从而将命令中所使用数字的缺省格式设为八进制。 输入该子命令后,adb 程序以八进制格式显示所有数字(除了那些用其他格式指定的数字外)。

$d 子命令的格式是 Radix$d 命令,其中 Radix 参数为基数的新值。 如果未指定 Radix 参数,那么 $d 子命令将基数设为缺省值 16。 第一次启动 adb 程序时,缺省格式为十六进制。 如果更改了缺省格式,那么通过自行输入 $d 子命令根据需要对其进行恢复:

$d

要将缺省格式设置为十进制,请使用以下命令:

0xa$d

更改反汇编方式

使用 $i$n 子命令迫使 adb 调试程序使用指定指令集和助记符对指令进行反汇编。 $i 子命令指定将要用于反汇编的指令集。 $n 子命令指定将要用在反汇编中的助记符。

如果未输入任何值,那么这些命令将显示当前设置。

$i 子命令接受以下值:

com
指定PowerPC®POWER® 系列通用交叉模式的指令集。
pwr
指定 POWER Architecture的 POWER 实现的指令集和助记符。
pwrx
指定 POWER 系列POWER2 实现的指令集和助记符。
ppc
指定 PowerPC的指令集和助记符。
601
指定 PowerPC 601 RISC 微处理器的指令集和助记符。
603
指定 PowerPC 603 RISC 微处理器的指令集和助记符。
604
指定 PowerPC 604 RISC 微处理器的指令集和助记符。
ANY
指定任何有效指令。 对于重叠的指令集,助记符将缺省为 PowerPC 助记符。

$n 子命令接受以下值:

pwr
指定 POWER Architecture的 POWER 实现的指令集和助记符。
ppc
指定 PowerPC 体系结构的助记符。