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

В этом разделе рассмотрен процесс работы с исходными файлами в программе отладки dbx.

С помощью программы dbx можно выполнять поиск и просматривать на экране фрагменты исходных файлов программы.

Для выполнения поиска необязательно открывать текст исходного файла. Программа dbx отслеживает текущий файл, текущую процедуру и текущую строку. Если существует файл дампа, то начальной текущей строкой текущего файла будет строка файла, содержащая исходную команду, на которой остановился процесс. это справедливо только в том случае, если процесс был прерван в разделе программы, откомпилированном для отладки.

Изменение каталога исходных файлов

По умолчанию программа dbx ищет исходный файл отлаживаемой программы в следующих каталогах:

  • Каталог, в котором находился исходный файл во время компиляции. Поиск в этом каталоге выполняется только в том случае, если компилятор поместил в объект имя каталога исходных файлов.
  • Текущий каталог.
  • Каталог, в котором в данный момент находится программа.

Список просматриваемых каталогов можно изменить с помощью опции -I, указываемой при вызове dbx, или с помощью команды use в программе dbx. Например, если после компиляции исходного файла вы переместили его в другой каталог, то с помощью одной из этих команд вы должны указать его старое расположение, новое расположение и некоторое временное расположение.

Просмотр текущего файла

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

С командами list, stop и trace можно использовать символы $ (знак доллара) и @ (коммерческое 'at'), которые определяют выражение строка-исходного-файла. Символ $ задает следующую выполняемую, а символ @ - следующую показываемую строку.

Команда move предназначена для перехода к следующей указанной строке.

Изменение текущего файла или процедуры

Команды func и file предназначены для изменения текущего файла, текущей процедуры и текущей строки внутри программы dbx без запуска какой-либо части вашей программы.

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

/Выражение [/]
Выполняется поиск по образцу в текущем исходном файле в прямом направлении.
? RegularExpression [?]
Выполняется поиск по образцу в текущем исходном файле в обратном направлении.

Если аргументы не указаны, то команда dbx выполняет поиск регулярного выражения, которое было задано последним. При достижении конца (начала) файла происходит переход к его началу (концу).

С помощью команды edit можно загрузить исходный файл во внешний текстовый редактор. Можно переопределить редактор, установленный по умолчанию (vi), указав имя редактора в переменной среды EDITOR перед запуском программы dbx.

После завершения сеанса редактирования управление процессом будет вновь передано программе dbx.

Отладка программ с несколькими нитями

Программы с несколькими пользовательскими нитями вызывают функцию pthread_create. Когда процесс вызывает эту функцию, операционная система создает внутри процесса новую нить. При отладке программы с несколькими нитями необходимо работать не с процессами, а с отдельными нитями. Программа dbx работает только с пользовательскими нитями: в документации по dbx под словом нить обычно подразумевается пользовательская нить. Программа dbx присваивает каждой нити в отлаживаемом процессе уникальный номер. Кроме того, при работе с dbx следует различать понятия активной нити и текущей нити:

Активная нить
Пользовательская нить, которая ответственна за останов программы при попадании в точку прерывания. С активными нитями работают команды, предназначенные для пошагового выполнения программы.
Текущая нить
Пользовательская нить, которую вы изучаете. В контексте текущей нити работают команды, выдающие информацию.

По умолчанию активная нить и текущая нить - это одно и то же. С помощью команды thread можно сделать текущей другую нить. В списке нитей, выдаваемом командой thread, текущая нить отмечена знаком >. Если активная нить не совпадает с текущей, то она отмечена знаком *.

Отладка программ с несколькими процессами

Программы с несколькими процессами обращаются к функциям fork и exec. Когда программа порождает процесс, операционная система создает новый процесс с тем же образом, что и у исходного процесса. Исходный процесс называется родительским, а создаваемый процесс - дочерним.

При выполнении процессом функции exec управление от исходного процесса передается новой программе. В обычных условиях выполняется отладка только родительского процесса. Однако программа dbx может выполнять отладку и дочерних процессов, если ввести команду multproc. Команда multproc позволяет выполнять параллельную отладку нескольких процессов.

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

(dbx) multproc on
(dbx) multproc
включен режим параллельной отладки
(dbx) run

При порождении процесса выполнение родительского процесса останавливается и программа dbx показывает информацию о состоянии программы:

порожден новый процесс, pid = 422, процесс остановлен, ожидается ввод
остановлен из-за порождения дочернего процесса в режиме с несколькими
процессами в точке 0x1000025a (fork+0xe)
(dbx)

Затем для отладки дочернего процесса открывается еще один виртуальный терминал Xwindow:

отладка дочернего процесса, pid=422, процесс остановлен, ожидается ввод
остановлен из-за порождения дочернего процесса в режиме с несколькими
процессами в точке 0x10000250
10000250 (fork+0x4) )80010010    1       r0,0x10(r1)
(dbx)

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

Если программа выполняет функцию exec в режиме параллельной отладки, то она переписывает саму себя, и символьная информация становится устаревшей. При выполнении функции exec все точки прерывания удаляются; новая программа останавливается для идентификации, упрощая отладку. Программа dbx сама подключается к образу новой программы, вызывает функцию для определения имени новой программы, сообщает это имя, а затем выдает приглашение на ввод. Приглашение выглядит примерно следующим образом:

(dbx) multproc
Включен режим параллельной отладки
(dbx) run
Attaching to program from exec . . . 
Determining program name . . . 
Successfully attached to /home/user/execprog . . . 
Reading symbolic information . . . 
(dbx)

Если новый процесс порождается программой с несколькими нитями, то в нем будет существовать только одна нить. Процесс должен вызывать функцию exec. В противном случае сохраняется исходная символьная информация, и команды, работающие с нитями (такие как thread), будут выдавать информацию об объектах родительского процесса, которая на самом деле уже будет устаревшей. При вызове функции exec исходная символьная информация обновляется, и указанные команды будут выдавать информацию об объектах нового дочернего процесса.

Для того чтобы следить за порожденным дочерним процессом, не открывая новое окно Xwindow, укажите в команде multproc флаг child. В этом случае при порождении процесса программа dbx будет следить за дочерним процессом. Если указать в команде multproc флаг parent, то при порождении процесса программа dbx остановится, но затем будет отслеживать родительский процесс. Если указать оба флага (и child, и parent), то будет отслеживаться выполняемый процесс. Эти флаги полезны при отладке программ без запуска Xwindows.