在 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: