GCC - The Complete Reference (537669), страница 58
Текст из файла (страница 58)
Следующий сеанс отладки демонстрирует информацию, которую выводит отладчик ддЬ, а также содержит пример использования других команд, позволяющих получать дополнительную информацию: 8 ддЬ Еа11доип соте Соте иав депегатеа Ьу 'Еа11доип'. Ргодтав Еегю1патеа иЕЕЬ вьдпа1 11, яедюептат1оп Еаи1т. аеааЕпд вувьо1в Етав /11Ы11Ьс.во.б...допе. Ьоааед вуюЬо1в Еог /11Ы11Ьс.во. б аеад1пд вувЬо1в Егов /11Ы1д-11пих.
во. 2... допе. Ьоадед вуюЬо1в Еог /11Ы1д-11пих. во. 2 $0 Ох080483а0 1п ветЬаа () ат Еа11доип.с:14 14 чпоипеге = "ТЬ(в 1в а втгьидКп"; (ддЬ) рг1пт поииеге 81 = (сЬат **) ОхО (ддЬ) Ьт $0 Ох080483аО 1п ветбад () ат Еа11аоип.с:14 2бО Часть )И. Внутренняя структура и окружение 81 ОхО8О48Звв Еп пвьп (егдс=1, вгд =ОхЬЕЕЕЕввс) ве Ее11ктс п.с:В 82 Ох40042316 1п 11Ьс веегг пв1п (пв1п=ох8048390 <шв1п>, агдс 1, пЬр вт=охЬЕЕЕЕа8с, Епьг=ох8048230 < 1п1Г>, Езпь=ох8048410 < Еьпь>, гг1с Е1п1=0х4000к)2Ес < 61 Еьпь>, вгвсИ епс=охЬЕЕЕЕа7с) ве ../вувсерв/депег1с/11Ьс-вгаге.ск129 (даЬ) чп1е $ В приведенном примере на экран выводится строка кода с ошибкой (та строка, в которой предпринимается попытка записи по абсолютному адресу "О").
Выводимая информация включает имя функции и имя файла, показывая положение этой строки исходного кода. Команда ргйпг используется для проверки того, что указатель по>)Ьеге указывает на ошибочный адрес, а команда Ье используется для обратной трассировки кода, которая показывает, каким путем программа пришла к аварийному завершению. Кроме того, имеется целый ряд других команд, которые позволяют получить достаточно информации дпя немедленного устранения ошибки в программе.
Подключение отладчика к выполняемой программе Возможность присоединения отладчика к выполняемому процессу может быть весьма полезной. Если, например, программа после некоторого времени входит в бесконечный цикл, то можно подключить отладчик к программе и точно определить место, в котором она зациклилась. Еше одна ситуация, в которой желательно подключение отладчика к выполняемой программе, может возникнуть при работе с интерактивной программой, когда она начинает делать что-то не то, В этом случае отладчик можно подключить к программе и отследить причину выполнения некорректных действий.
Для подключения отладчика к выполняемому процессу необходимо соблюдение двух условий. Во-первых, выполняемый процесс опять-таки должен быть откомпилирован с одной из форм опции -д. А во-вторых, необходимо как-то определить идентификатор процесса !Р!Р— Ргосеае ! Е)). Если идентификатор Р! (/ процесса не известен, то дпя его определения можно воспользоваться командой рв. Аргументы командной строки для команды рв в разных системах могут отличаться, поскольку разные операционные системы предоставляют информацию о выполняемых процессах в различных форматах.
Типичную форму команды рв показывает следуюшнй пример, в котором она определяет, что идентификатор процесса 1оорег равен 29627: 8 рв вх ( дгер 1ссрег 29627 рев/4 К 1.58 1ссрег 12298 ргв/4 В О:ОО дгер 1ссрег Результаты выполнения команды рв указывают на то, что процесс 1оорег является активным (в означает "гнпп)пя", то в стадии выполнения).
Фактически програм- Глава ) 2. Использование отладчика 6Ы0 26 1 ма 1оорег. с была специально написана с бесконечным циклом — для демонстра- ции подключения отладчика дйЬ к выполняемому процессу: /* 1оорег.с */ иоьй доагоипй(1пе)к ьпс ваап(ьпе агдс,сцаг *агд1т()) ( ргьпег(<веагеейтп")/ доагоипй(20)/ ргьпст("йопекп"); ) чоьй доагоипй(ьпе соипеег) ( 1пе 1 = 0) иЬ11е(1 < соипеег) ( 16(1++ == 17) 1 = 10( ) ) Основная функция программы 1оорег вызывает функцию доагоипй ( ), выполнениее которой не прекращается, поскольку значение переменной цикла 1 никогда не достигает значения соипеег.
Приведенную программу можно откомпилировать с генерацией отладочной информации с помощью следующей команды: 8 дсс -д 1оорег.с -о 1оорег Для запуска программы в фоновом режиме введите команду; б 1оорег а Используемая для запуска программная оболочка„как правило, выведет идентификатор нового процесса. Если же идентификатор не выводится, для его определения можно воспользоваться командой рв. Приведенная ниже последовательность показывает порядок подключения отладчика к процессу и его использование для обнаружения ошибки.
В командной строке на запуск отладчика указывается имя находящегося на диске двоичного файла программы и идентификатор процесса: 8 дйЬ 1оорег 29627 йссасдьпд Ео ргодгав: /иове/ггей/1оорег, ргосевв 29627 веай1пд вушьо1в ггош /11Ы11Ьс. во. б...йопе. ьоайей вушЬо1в гог /11Ы11Ьс.во.б аеайьпд вуаЬо1в гхош /11Ы1й-11пих.во.2...йопе. Ьоайей вувЬо1в бог /11Ы1й-11пих.во.2 Ох080483еа ьп доагоипй (соипсег=20) аг 1оорег.с:14 14 1г(1++ == 17) (дйЬ) йьвр1ау 1 1: 1 = 14 (дйЬ) веер 13 иЬ11е(1 < соипсег) [ 1: 1 = 15 (дйЬ) всер 14 16(1++ = 17) 2б2 Часть ]и.
Внутренняя структура и окружение 1: 1 = 15 [дйЫ веер 13 еЬ11е(1 < соппеег) ( 1: 1 = 16 (ддЫ веер 14 16(1++ == 17] 1: 1 16 (ддЬ) веер 13 еЬ11е(1 < соипеег] ( 1: 1 = 17 <ддЫ веер 14 11(1++ == 17) 1: 1 = 17 (ддЫ веер 15 — 10) 1: 1 = 18 <ддЫ всер 13 еЬ11е(1 < соппеег) 1с 1 = 10 (ддЫ веер 14 15(1++ == 17] 1: 1 = 10 <ддЫ веер 13 нЬ11е(1 < соипеег) ( 1: 1 = 11 (дйЬ) дп1е тье ргодгеп 1в гиппапд. Яи1е епунеу (апй йееась 1е)? (у ог и) у Эееесдапд Егоп ргодгем: /Ьоте/эгей/1оорег, ргосевв 29627 Ф Как видно из первых строк листинга, вначале отладчик считывает бинарный файл с лиска и загружает из программы и используемых библиотек таблицы перекодировки символов. Если библиотеки компилировались с включением отладочной информации, то при необходимости можно выполнять трассировку кода и в библиотеках, но в приведенном прос~ом примере отладчик используется только для трассировки цикла в функции доегоипй(].
Далее отладчик дйь подключается к процессу, останавливает его выполнение на текущей инструкции и выводит соответствующую ей строку исходного кода с ее номером в исходном файле. На данном этапе можно установить точки останова, просмотреть значения переменных и выполнить любые другие действия, обычно предпринимаемые в процессе отладки. В приведенном примере команда й1вр1ау используется лля вывода значения переменной з.
при каждом останове программы. Для отслеживания значения этой переменной при выполнении нескольких строк цикла используется серия команд веер. Они показывают, что значение перел(енной 1 изменяется таким образом, что цикл не может прийти к завершению. В конце сеанса отладки с помощью команды дпйс отладчик отсоединяется от процесса и позволяет продолжить его выполнение.
В приведенном примере после отключения отладчика дйЬ программа продолжит выполнение бесконечного цикла, пока она не будет остановлена каким-нибудь другим способом. Процесс снова нор- Глава 13. Использование отладчика 6йц 2б3 Сводная таблица команд отладчика Отладчик дст12 в интерактивном режиме поддерживает огромное количество команд. Для их просмотра в командной строке дб12 можно ввести команду тте1р. На экране появится длинный список категорий команд. В некоторых категориях приведены описания команд, в то время как в других находятся подкатегории, содержащие списки команд. В таблице 13.3 приведены только некоторые наиболее часто используемые команды, которые нужны практически в любом сеансе отладки.
Таблица 13.3. Часто используемые команды отладчика ддЬ вемееле Описание Устанавливает слежение за значением. При каждой операции считывания ипи записи в области памяти, соответствующей указанному имени символа, выполнение программы останавливается. Также см. команды хиассь инассь. анаьсь Выводит обратный след вызовов всех стексвых Фреймсв, показывающий вызовы функций и значения их аргументов, через которые выполнение дошло до данной точки. Эта команда имеет короткую форму ьс. Ьасььхасе Устанавливает точку останова, которая останавливает выполнение программы на указанной строке кода ипи в указанной функции.
Снимает точку остансва в ранее указанной с помощью команды ьхаах строке кода ипи функции. Ьхеаи с1аах Продолжает выполнение программы, остановленной отладчиком. сопь1ппе скх1-с Прерывает выпопнение программы так, как еспи бы в выполняемой строке быпа спредепена точка останова. Отключает определенные точки остансва по их номерам. асваЬ1а 61вр1 ау При каждом останове программы выводит на экран значение указанного выражения. Включает определенные точки астапова по их номерам.
апаЬ1а Е1п1аЬ Продолжает выполнение программы, остановленной отладчиком, до выхода из текущей функции. Устанавпивает счетчик игнорирования точки сстансва. Так, например, команда 1рпоха 4 21 указывает, что до остановки на точке останова с номером 4 она должна быть пройдена 23 раза. 1епохе ЕпЕо Ьхеаьро1пьв Выводит состояние и описание дпя всех точек астапова с их номерами. Выводит состояние и описание для всех ранее введенных команд е1ар1ау, включая их номера. 1пЕо 61ар1ау Завершает выпспнение текущего процесса. Выводит на экран десять строк кода. Если в командной строке нет других аргументов, выводимые строки начинаются с текущей строки.
Если в команде указано имя функции, выводимые строки начинаются от начала функции. Если указан номер строки, тс эта строка будет выведена первой. 11 вь мально выполняется, и в любой момент к нему снова можно подключить отладчик. Для остановки процесса 1оорег перед командой дцзс можно было бы выполнить команду 1с111.