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