Работа с программой отладки dbx
В этом разделе приведена информация о работе с программой отладки dbx.
Запуск программы отладки dbx
Программу dbx можно запустить с различными параметрами. Ниже перечислены три самых распространенных способа запуска dbx:
- Вызов команды dbx для конкретного объектного файла
- Вызов команды dbx с флагом -r для отладки программы, завершившейся аварийно
- Вызов команды dbx с флагом -a для отладки процесса, который уже запущен
Сразу после запуска команда dbx ищет файл .dbxinit в текущем пользовательском каталоге или в пользовательском каталоге $HOME. Если файл .dbxinit существует, то в начале сеанса отладки выполняются команды из этого файла. Если файл .dbxinit есть и в домашнем, и в текущем каталоге, то оба файла считываются в указанном порядке. Так как файл .dbxinit из текущего каталога считывается вторым, то команды из этого файла могут изменить результат выполнения команд из файла, расположенного в домашнем каталоге.
Если имя объектного файла не указано, программа dbx запрашивает имя объектного файла для отладки. Имя файла по умолчанию - a.out. Если в текущем каталоге есть файл core или если указан параметр ФайлДампа, то программа dbx сообщает о том, в каком месте произошел сбой программы. До начала выполнения объектного файла можно просмотреть значения переменных, а также содержимое регистров и областей памяти, сохраненные в файле дампа. Начиная с этого момента, dbx начинает запрашивать команды.
Отладка образа ядра с недостающими зависимыми модулями
Начиная с AIX 5.3, программа dbx позволяет анализировать образ ядра даже в отсутствие зависимых модулей. При инициализации для каждого из недостающих модулей выдается сообщение.
- При попытке прочитать содержимое областей памяти, относящихся к текстовым разделам недостающих модулей, выдается сообщение об ошибке. Это сообщение схоже с сообщением об ошибке, вызыванной отсутствием запрошенных данных в файле ядра.
- Пользователю недоступна информация о символах, хранящихся в таблицах символов недостающих модулей. Поведение программы dbx в таких ситуациях такое же, как если бы из недостающего модуля была исключена таблица символов.
- Фреймы стеков процедур из недостающих модулей выглядят в программе следующим образом:
Кроме того, указываются адрес инструкции в неизвестной процедуре и имя недостающего модуля..()
Программе dbx можно указать расположение доступных из недостающих модулей с помощью флага -p. Дополнительная информация приведена в описании команды dbx в книге Справочник по командам, том 2.
Отладка образа ядра с рассинхронизированными зависимыми модулями
Начиная с AIX 5.3, программа dbx определяет, изменялись ли зависимые модули, указанные в файле ядра, с момента создания файла ядра. При инициализации программы для каждого измененного зависимого модуля выдается уведомление.
Следует помнить, что вся информация, которую программа dbx показывает на основе содержимого измененного зависимого модуля, может быть неточной. Для того чтобы поставить пользователя в известность о возможных неточностях, программа dbx выдает уведомления всегда, когда отображается потенциально неточная информация.
Можно отключить эту функцию и перевести программу dbx в режим, когда измененные зависимые модули считаются отсутствующими. Для этого нужно экспортировать переменную среды DBX_MISMATCH_MODULE со значением DISCARD. В этом режиме программа dbx по-прежнему уведомляет пользователя о том, что модуль был изменен, но в дальнейшем работает так, как если бы он был недоступен.
Программе dbx можно указать расположение правильных версий недостающих модулей с помощью флага -p. Дополнительная информация приведена в описании команды dbx в книге Справочник по командам, том 2.
Запуск команд оболочки из dbx
С помощью подкоманды sh можно запускать команды оболочки, не прерывая программу отладки.
Если команда в sh не указана, то будет выполнен временный выход в оболочку, а после завершения работы с ней управление будет возвращено программе dbx.
Редактор командной строки dbx
В командной строке dbx применяются функции редактирования, аналогичные функциям оболочки Korn. Режим vi предоставляет функции, схожие с редактором vi, а режим emacs - схожие с редактором emacs.
Для включения этих функций вызовите подкоманду dbx set -o или set edit. Для включения функций редактора vi введите подкоманду set edit vi или set -o vi.
Кроме того, выбрать режим редактирования можно с помощью переменной среды EDITOR.
Программа dbx записывает введенные команды в файл хронологии .dbxhistory. Если переменная среды DBXHISTFILE не установлена, то будет применяться файл хронологии $HOME/.dbxhistory.
По умолчанию команда dbx хранит 128 последних введенных команд. Для увеличения этого значения применяется переменная среды DBXHISTSIZE.
Управление выполнением программ
При работе с программой символьной отладки dbx вы можете добавлять в программу точки прерывания. После запуска программы dbx вы можете задать строки и адреса, которые будут выполнять роль точек прерывания, а затем запустить программу, отлаживаемую с помощью dbx. Когда программа дойдет до точки прерывания, ее выполнение будет приостановлено с выдачей соответствующего сообщения. После этого можно будет проверить состояние программы с помощью команд dbx.
Вместо применения точек прерывания можно выполнять программу по шагам, т.е. по одной инструкции или по одной строке за раз.
Установка и удаление точек прерывания
С помощью подкоманды stop задайте точки прерывания в программе dbx. Команда stop останавливает выполнение прикладной программы при выполнении определенных условий:
- Переменная изменилась и задан параметр Переменная.
- Выполнено Условие и задан флаг if Условие.
- Вызвана Процедура и задан флаг in Процедура.
- Достигнута строка
кода и задан флаг at
строка кода.
Примечание: Значение строки кода может быть указано в виде целого числа или в виде строки, содержащей имя исходного файла, затем двоеточие (:) и целое число, задающее номер строки в файле.
После вызова этих команд программа dbx будет отправлять сообщение с номером одного из событий, заданных в качестве точки прерывания. Можно связать команды dbx с идентификатором определенного события с помощью команды addcmd. Эти связанные команды dbx выполняются при достижении точки прерывания, точки трассировки или точки наблюдения, соответствующей данному событию. С помощью команды delcmd можно удалить связанные команды dbx из указанного ИД события.
Запуск программ
Подкоманда run предназначена для запуска программы. Эта команда указывает программе dbx, что необходимо запустить объектный файл. Аргументы в этом случае указываются так же, как и при запуске из командной строки. Формат подкоманды rerun совпадает с форматом run, за тем исключением, что если ей не передан список аргументов, то используются аргументы из предыдущего вызова. После запуска отлаживаемая программа выполняется до наступления любого из следующих событий:
- Программа встречает точку прерывания
- Возникает сигнал, который не должен игнорироваться, например, INTERRUPT или QUIT.
- При отладке нескольких процессов возникло событие, связанное с несколькими событиями.
- Программа выполняет функцию
load,
unload или loadbind.
Примечание: Программа dbx игнорирует это условие, если задана переменная отладки $ignoreload. По умолчанию эта переменная задана. Более подробная информация приведена в описании команды set.
- Программа завершает работу
В любом случае управление передается программе отладки dbx, которая показывает сообщение о причине остановки программы.
Продолжить выполнение остановленной программы можно с помощью следующих команд:
| Команда | Описание |
|---|---|
| cont | Продолжает выполнение программы с той точки, в которой оно было прервано. |
| Отключить | Продолжает выполнение программы с той точки, в которой оно было прервано, при этом происходит выход из отладчика. Эта команда полезна в тех случаях, если вы исправили программу и хотите продолжить ее выполнение, но уже не в среде отладчика. |
| return | Продолжает выполнение до тех пор, пока не произойдет возврат в Процедуру, или, если Процедура не указана, пока не завершится текущий процесс. |
| skip | Продолжает выполнение программы до ее завершения или до перехода через точки прерывания указанное число + 1 раз. |
| step | Выполняет одну строку исходного кода или указанное число строк. |
| next | Выполняет программу до следующей строки исходного кода или выполняет указанное число строк исходного кода. |
Наиболее распространенный способ отладки - это пошаговое выполнение программы. Для этого предназначены подкоманды step и next. Различие между этими двумя командами проявляется лишь в том случае, когда следующая строка исходного кода содержит вызов функции. В этом случае команда step входит в функцию и останавливается, а как команда next полностью выполняет функцию и останавливается на следующем операторе после вызова функции.
Изменить способ выполнения программы step можно с помощью переменной $stepignore. Дополнительная информация приведена в документации по команде dbx в Справочник по командам, том 2.
Остановкам в ходе пошагового выполнения программы не присваивается номер события, так как останов программы не связан ни с каким постоянным событием.
Если в программе есть несколько нитей, подкоманды cont, next, nexti и step обработают их правильно. Эти команды выполняются для конкретной нити, поэтому даже если другая нить обрабатывается командами cont, next, nexti или step, первая нить будет продолжать работать до тех пор, пока не встретит код, вызвавший прерывание.
Если вам нужно, чтобы перечисленные команды выполняли только текущую нить, можно установить переменную отладчика dbx с именем $hold_next; если эта переменная установлена, программа dbx во время выполнения команд cont, next, nexti и step приостанавливает обработку других нитей.
Примечание: При работе в таком режиме следует помнить, что приостановленная нить не может снять установленные ею блокировки; если при этом другая нить ожидает снятия одной из этих блокировок, выполнение программы может зайти в тупик.
Отделение вывода dbx от вывода программы
При отладке программ, работающих с экраном, например, текстовых редакторов и графических программ, следует применять команду screen. Эта команда открывает для программы dbx окно Xwindow. Отлаживаемая программа при этом продолжает выполняться в своем окне. Если не вызвана команда screen, то вывод программы dbx будет перемешан с выводом других программ.
Трассировка
Подкоманда trace указывает программе dbx, что необходимо напечатать информацию о состоянии отлаживаемой программы. Подкоманда trace может существенно замедлить выполнение программы, в зависимости от загруженности dbx. Существует пять вариантов трассировки:
- Пошаговое выполнение программы, позволяющее печатать каждую выполняемую строку исходного кода. Для настройки команды trace применяется переменная отладки $stepignore. Более подробная информация приведена в описании команды set.
- Отладчик может печатать только выполняемые строки конкретной процедуры. Можно также указать дополнительные условия, позволяющие управлять выводом трассировочной информации.
- Отладчик может отправлять сообщение при каждом вызове и завершении процедуры.
- Отладчик может напечатать указанную строку исходного кода, когда она будет выполняться.
- Отладчик может напечатать значение выражения, когда программа будет выполнять указанную строку.
Удаление событий трассировки происходит так же, как и удаление точек прерывания. При выполнении команды trace на экран выводится ИД соответствующего события, а также информация о внутреннем представлении этого события.