[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]

Программирование: Разработка и отладка программ


Пример форматирования данных при отладке с помощью 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

Перед символом форматирования можно указать число повторений данного формата.

Для просмотра списка инструкций с указанием адреса каждой четвертой инструкции введите следующую команду:

.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:     Это строка символов

Для просмотра переменной number в виде десятичного целого числа нужно ввести такую команду:

number/D
number:
number:    456

Можно просматривать значения переменных в различных форматах. Например, с помощью следующих команд вы можете вывести на экран значение переменной lnum как 4-байтовое десятичное, восьмеричное или шестнадцатеричное число:

lnum/D
lnum:
lnum:     1234
 
lnum/O
lnum:
lnum:     2322
 
lnum/X
lnum:
lnum:     4d2

Можно просматривать значения переменных и в других форматах. В следующем примере выдается последовательность шестнадцатеричных значений некоторых переменных, занимающая пять строк, по восемь значений в строке:

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    d2     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      Это стр
          6120  6368  6172  6163      ока симв
          7465  7220  7374  7269      олов~@~@
          6e67     0     0     1      ~@~@~@~@~@~@~A
          0    1c8   0       0      ~@~@~A~<c8>~@~@~@~@

В данном случае команда выдает четыре значения в шестнадцатеричном виде, а затем повторяет те же значения как восемь символов ASCII. Символ ^ (знак вставки) используется четыре раза перед выдачей символов, чтобы снова сделать текущим начальный адрес данной строки.

Для того чтобы можно было легко разобраться в данных, показанных на дисплее, вставляйте между числами и символами символы табуляции, и печатайте адрес каждой строки:

str1,5/4x4^8t8Cna
str1:
str1:     5468  6973  2069  7320      Это стр
str1+8:   6120  6368  6172  6163      ока симв
str1+10:  7465  7220  7374  7269      олов~@~@
str1+18:  6e67     0     0     1      ~@~@~@~@~@~@~A
 
number:
number:    0     1c8     0     0      ~@~@~A~<c8>~@~@~@~@
fpt:

Связанная информация

Обзор программы отладки adb

Применение выражений в программе adb

Просмотр и редактирование исходного файла с помощью программы adb

Пример программы adb: adbsamp2

Пример программы adb: adbsamp3


[ Страница назад | Страница вперед | Содержание | Индекс | Библиотека | Юридическая информация | Поиск ]