在 adb 调试中设置数据格式的示例
要在每个机器指令后显示当前地址,请输入:
main , 5 ? ia当与示例程序 adbsamp 一起使用时,将产生如以下内容的输出:
.main:
.main: mflr 0
.main+4: st r0, 0x8(r1)
.main+8: stu rs, (r1)
.main+c: li l r4, 0x1
.main+10: oril r3, r4, 0x0
.main+14:要想更清楚地说明当前地址不属于出现在同一行上的指令,请将换行格式符 (N) 添加到命令:
.main , 5 ? ian此外,可在格式化字符前放置一个数字以指示重复该格式的次数。
要在每 4 个指令后显示指令列表并包含地址,请使用以下命令:
.main,3?4ian此指令在与示例程序 adbsamp 一起使用时,产生以下输出:
.main:
mflr 0
st r0, 0x8(r1)
stu r1, -56(r1)
lil r4, 0x1
.main+10:
oril r3, r4, 0x0
bl .f
l r0, Ox40(r1)
ai r1, r1, 0x38
.main+20:
mtlr r0
br
Invalid opcode
Invalid opcode
.main+30:注意放置此数字的位置。
以下命令尽管与先前命令相似,但产生的输出不同:
main,3?i4an .main:
.main: mflr 0
.main+4: .main+4: .main+4: .main+4:
st r0, 0x8(r1)
.main+8: .main+8: .main+8: .main+8:
stu r1, (r1)
.main+c: .main+c: .main+c: .main+c:可将格式请求合并以提供详细显示。 例如,输入以下命令将显示后跟其十六进制等价物的指令助记符:
.main,-1?i^xn在此示例中,显示从地址开始main.负数(-1)会导致命令的无限期调用,因此显示会一直持续,直到出现错误条件(如文件结束)。 在格式上,i显示该位置的助记符指令,^(插入标记) 将当前地址移回到指令开头,并且x将指令重新显示为十六进制数字。 最后,n向终端发送换行符。 输出类似于以下内容,只是稍微长些:
.main:
.main: mflr 0
7c0802a6
st r0, 0x8(r1)
9001008
st r1, -56(r1)
9421ffc8
lil r4, 0x1
38800001
oril r3, r4, 0x0
60830000
bl - .f
4bffff71
l r0, 0x40(r1)
80010040
ai r1, r1, 0x38
30210038
mtlr r0
7c0803a6以下示例显示如何在 ? 中组合格式 或 / 子命令以在同一程序中一起存储时显示不同类型的值。 它使用 adbsamp 程序。 对于具有与其一起工作的变量的命令,必须首先设置一个停止该程序的断点,然后运行此程序直至它找到该断点。 使用 :b 命令设置断点:
.main+4:b使用 $b 命令显示该断点已设置:
$b
breakpoints
count bkpt command
1 .main+4通过输入以下内容,运行此程序直至它找到该断点:
:r
adbsamp: running
breakpoint .main+4: st r0, 0x8(r1)现在可以显示程序停止时的状况。 要显示各个变量的值,请在 /(斜杠)命令中给出其名称和对应格式。 例如,以下命令显示str1作为字符串:
str1/s
str1:
str1: This is a character string以下命令显示number作为十进制整数:
number/D
number:
number: 456可以选择以各种格式查看变量。 例如,可通过输入以下命令将长整型变量 lnum 显示为 4 字节十进制、八进制和十六进制数:
lnum/D
lnum:
lnum: 1234
lnum/O
lnum:
lnum: 2322
lnum/X
lnum:
lnum: 4d2还可以其他格式检查变量。 例如,以下命令将一些变量显示为一行上的 8 个十六进制值,并继续显示 5 行:
str1,5/8x
str1:
str1: 5468 6973 2069 7320 6120 6368 6172 6163
7465 7220 7374 7269 6e67 0 0 0 0
number: 0 1c8 0 0 0 4d2 0 0
3fa0 0 0 0 5468 6973 2069 7320
7468 6520 7365 636f 6e64 2063 6861 7261既然数据包含数字和字符串值的组合,那么将每个值都显示为数字和字符以查看实际字符串的位置。 可使用一个命令执行此操作:
str1,5/4x4^8Cn
str1:
str1: 5468 6973 2069 7320 This is
6120 6368 6172 6163 a charac
7465 7220 7374 7269 ter stri
6e67 0 0 0 ng~@~@~@~@~@~@
0 1c8 0 0 ~@~@~A~<c8>~@~@~@~@在此情况下,命令以十六进制显示 4 个值,然后将相同值显示为 8 个 ASCII 字符。 在显示字符前使用 ^(插入标记)4 次,以将当前地址设置回该行的起始地址。
要使显示易于阅读,可在值和字符之间插入一个制表符,并给出每行的地址:
str1,5/4x4^8t8Cna
str1:
str1: 5468 6973 2069 7320 This is
str1+8: 6120 6368 6172 6163 a charac
str1+10: 7465 7220 7374 7269 ter stri
str1+18: 6e67 0 0 1 ng~@~@~@~@~@~A
number:
number: 0 1c8 0 0 ~@~@~A~<c8>~@~@~@~@
fpt: