定制 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 体系结构的助记符。