Для того чтобы после каждой машинной инструкции выдавался текущий адрес, введите следующую команду:
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: adbsamp2
Пример программы adb: adbsamp3