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

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


Управление выполнением программы

В этом разделе обсуждаются: команды, необходимые для подготовки программ к отладке; выполнение программ; установка, просмотр и удаление точек прерывания; возобновление выполнения программ; пошаговое выполнение; остановка программ и уничтожение процессов.

Рассматриваются следующие вопросы:

Подготовка программ к отладке с помощью программы adb

С помощью программы cc откомпилируйте программу и поместите ее в файл (например, adbsamp2):

cc adbsamp2.c -o adbsamp2

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

adb adbsamp2

Язык программирования C не создает для программ меток операторов, поэтому при работе с программой отладки, обращение к отдельным операторам языка C невозможно. Для более эффективной работы вам следует ознакомиться с тем, какие команды создает компилятор С, и каким образом они связаны с отдельными операторами языка С. Перед тем, как приступать к отладке программы с помощью adb, иногда бывает полезно сделать распечатку текста этой программы на ассемблере. Затем, в процессе отладки вы сможете при необходимости обращаться к этой распечатке. Для создания распечатки на языке ассемблера введите команду cc с флагом -S или -qList.

Например, для создания распечатки программы adbsamp2.c введите следующую команду:

cc -S adbsamp2.c -o adbsamp2

При этом будет создан файл adbsamp2.s, содержащий распечатку, а программа будет откомпилирована и помещена в исполняемый файл adbsamp2.

Запуск программ

Для запуска программ применяются команды :r и :R. Дополнительные сведения об этом приведены в разделе Просмотр и редактирование исходного файла с помощью программы adb. Формат команд:

[ Адрес ][,Счетчик ] :r [Аргументы ]

или

[ Адрес ][,Счетчик ] :R [Аргументы ]

Здесь параметр Адрес указывает адрес, с которого следует начать выполнение программы; параметр Счетчик - число точек прерывания, которое следует пропустить; параметр Аргументы - аргументы командной строки (например, имена файлов и опции выполнения программы).

Если параметр Адрес не указан, adb то выполнение программы будет начато с начала. Для запуска программы с начала введите следующую команду:

:r

Если будет указан параметр Счетчик, то программа adb проигнорирует указанное число точек прерывания. Например, для пропуска первых пяти точек прерывания нужно ввести следующую команду:

,5:r

Необходимо отделять аргументы друг от друга по крайней мере одним пробелом. Аргументы передаются программе точно также, как оболочка системы передает программам аргументы командной строки. Это позволяет использовать символы перенаправления оболочки.

Команда :R перед началом выполнения программы передает ей аргументы командной строки через оболочку. В аргументах можно применять шаблоны для обозначения множества файлов или других вводимых значений. Перед тем, как передать аргументы программе, оболочка раскрывает такие шаблоны. Эта функция необходима в тех случаях, когда для программы нужно указывать несколько имен файлов. Например, приведенная ниже команда передает аргумент [a-z]* оболочке, которая преобразует его в список имен файлов, а затем передает программе:

:R [a-z]*.s

Команды :r и :R перед запуском программы удаляют содержимое всех регистров и уничтожают текущий стек. Эта операция останавливает выполнение любой другой копии программы.

Установка точек прерывания

Для создания в программе точек прерывания предусмотрена команда :b. Если задана точка прерывания, то по достижении указанного адреса программа останавливает свое выполнение. После этого управление возвращается программе отладки adb. Формат команды:

[Адрес] [,Счетчик ] :b [Команда]

Здесь в параметре Адрес должен быть указан допустимый адрес команды; параметр Счетчик задает число точек прерывания, которые нужно пропустить, а параметр Команда указывает команду adb, которую нужно запускать при каждом выполнении команды (вне зависимости от того, останавливается ли программа в точке прерывания). Если указанная команда устанавливает . (точку) рядом со значением 0, то выполнение программы в этой точке будет остановлено.

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

.f :b

Прерывание произойдет сразу же после передачи управления этой функции, но перед созданием стека функции.

Точку прерывания со счетчиком применяют в функциях, которые вызываются в процессе выполнения программы несколько раз, а также в инструкциях, относящихся к операторам for и while. Такая точка прерывания позволяет продолжать выполнение программы до тех пор, пока определенная функция или инструкции не будут выполнены заданное число раз. Например, следующая команда устанавливает точку прерывания для функции f в программе adbsamp2 со счетчиком 2:

.f,2 :b

Таким образом, выполнение программы будет прервано только при втором запуске этой функции.

Просмотр точек прерывания

Определить значение счетчика для любой установленной точки прерывания, а также расположение этой точки можно с помощью команды $b. Данная команда выводит список точек прерывания, упорядоченных по адресу, а также все значения счетчиков и команды, определенные для каждой точки. Ниже приведен пример установки двух точек прерывания в файле adbsamp2 и их просмотра с помощью команды $b:

.f+4:b
.f+8:b$v
$b
breakpoints
count  brkpt             command
1      .f+8              $v
1      .f+4

После запуска программа остановится на первой же точке прерывания, например, .f+4. Если вы продолжите выполнение программы с помощью команды :c, она вновь остановится на следующей точке прерывания, после чего будет выполнена команда $v. Вот как будет выглядеть соответствующая последовательность команд и ответов:

:r
adbsamp2:running
breakpoint        .f+4:         st       r3,32(r1)
:c
adbsamp2:running
variables
b = 268435456
d = 236
e = 268435512
m = 264
breakpoint        .f+8           l       r15,32(r1)

Удаление точек прерывания

Формат команды :d (удаление точки прерывания из программы):

Адрес :d

Здесь параметр Адрес задает адрес удаляемой точки прерывания.

Например, для удаления точки прерывания, соответствующей началу функции f в программе adbsamp2, введите следующую команду:

.f:d

Возобновление выполнения программ

Формат команды :c (продолжение выполнения программы после остановки в точке прерывания):

[Адрес] [,Счетчик] :c [Сигнал]

Здесь параметр Адрес указывает адрес, с которого следует возобновить выполнение программы; параметр Счетчик - число точек прерывания, которое нужно пропустить; параметр Сигнал - номер сигнала, который нужно направить программе.

Если параметр Адрес не указан, то программа возобновит выполнение с первой же команды, следующей за точкой прерывания. Если указать значение параметре Счетчик, то программа отладки adb проигнорирует соответствующее число точек прерывания.

Если выполнение программы прервано с помощью клавиши Interrupt или Quit, то этот сигнал будет автоматически передан программе при ее перезапуске. Для того чтобы не передавать сигнал в таких случаях, введите следующую команду:

[Адрес] [,Счетчик] :c 0

Аргумент 0 запрещает отправку сигнала подпроцессу.

Выполнение отдельной инструкции программы

Для выполнения отдельной инструкции или пошагового выполнения программы предусмотрена команда :s. Эта команда выполняет инструкцию и возвращает управление программе отладки adb. Формат команды:

[Адрес ] [,Счетчик ] :s [Сигнал]

Здесь параметр Адрес указывает адрес инструкции, которую нужно выполнить, а Счетчик - число выполняемых команд. Если в настоящее время никакие подпроцессы не выполняются, то в качестве подпроцесса будет запущен указанный Объектный_файл. В этом случае передача сигнала невозможна и остальная часть строки будет рассматриваться как аргументы подпроцесса. Если не указать значение параметра Адрес, то программа adb использует текущий адрес. Если определить параметр Счетчик, то программа adb последовательно запустит соответствующее число команд. В режиме пошагового выполнения точки прерывания игнорируются. В качестве примера, ниже приведена команда для запуска первых пяти команд функции main:

.main,5:s

Остановка выполнения программ с помощью клавиш Interrupt и Quit

Остановить выполнение программы можно с помощью клавиш Interrupt и Quit. При нажатии любой из этих клавиш текущая программа будет остановлена, а управление будет передано программе отладки adb. Эти клавиши оказываются полезными при отладке программ с бесконечными циклами и другими ошибками.

При нажатии клавиши Interrupt или Quit программа adb автоматически сохраняет сигнал. При возобновлении выполнения программы с помощью команды :c, программа отладки adb автоматически направляет сигнал программе. Эта функция полезна при тестировании программ, использующих сигналы в процессе выполнения. Для того чтобы возобновить выполнение программы, не направляя при этом сигналов, введите следующую команду:

:c 0

Аргумент 0 запрещает отправку сигнала программе.

Остановка выполнения программ

Для остановки отлаживаемой программы применяется команда :k. Эта команда останавливает процесс программы и возвращает управление программе отладки adb. При этом содержимое системных регистров и стека очищается, а программа перезапускается. Ниже показан пример применения команды :k для удаления текущего процесса из программы adb:

:k

560:    killed

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

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

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

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

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

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


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