4.3. Отладчик GNU

4.3. Отладчик GNU

gdb — это отладчик, рекомендуемый Free Software Foundation, gdb представляет собой хороший отладчик командной строки, на котором строятся некоторые инструменты, включая режим gdb в Emacs, графический отладчик Data Display Debugger (http://www.gnu.org/software/ddd/) и встроенные отладчики в некоторых графических интерфейсах IDE. В этом разделе рассматривается только gdb.

Запустите gdb с помощью команды gdb имя_программы. gdb не будет просматривать значение PATH в поисках исполняемого файла. Отладчик загрузит символьную информацию для исполняемого файла и запросит дальнейших действий.

Существует три способа проверить процесс с помощью gdb.

• Используя команду run для обычного выполнения программы.

• Используя команду attach для начала проверки уже запущенного процесса. При подключении к процессу, последний останавливается.

• Исследуя существующий файл ядра для определения состояния процесса при его завершении. Для исследования файла ядра gdb потребуется запустить с помощью команды имя_программы файл_ядра.

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

gdb не требует написания полного имени команды; указание r достаточно для run, n — для next, s — для step. Более того, для повторения наиболее часто употребляемой команды, нужно просто нажать клавишу <Enter>. Таким образом, пошаговое выполнение программы становится проще.

Ниже предложен небольшой набор полезных команд gdb; gdb включает полное онлайновое руководство в формате GNU info (запустите info gdb), в котором детально объясняются все опции gdb. В [19] содержится неплохое подробное руководство по работе с gdb. gdb также поддерживает оперативную справку, ссылки на которую можно найти внутри gdb; доступ к справочным файлам можно получить, введя команду help. Можно также получить справку по каждой определенной команде, набрав help команда или help тема.

Подобно командам оболочки, команды gdb могут принимать аргументы. "Вызвать help с аргументом команда" означает то же самое, что и "набрать help команда".

Некоторые команды gdb также принимают идентификаторы формата для спецификации вывода значений. Идентификаторы формата располагаются за именем команды и отделяются от него косой чертой. После выбора формата необходимость использовать его каждый раз при повторе команды отпадает; gdb запоминает выбранный формат и использует его по умолчанию.

Идентификаторы формата отделены от команд символом / и состоят из трех элементов: цифра, буква формата и буква, отражающая размер. Цифра и буква размера не обязательны; по умолчанию в качестве цифры устанавливается 1, а размер получает подходящее значение по умолчанию, основанное на букве формата.

Буквы формата следующие: о для обозначения восьмеричного числа, x для шестнадцатеричного числа, d для десятичного числа, и для беззнакового десятичного числа, t для двоичных данных, f для числа с плавающей запятой, а для адреса, i для инструкций, с для символа, s для строки.

Символы, отображающие размер, таковы: b — байт, h — полуслово (2 байта), w — слово (4 байта), g — слово-гигант (8 байт).

attach, at

Подключает отладчик к уже запущенному процессу. Единственным аргументом является идентификатор процесса (pid), к которому осуществляется подключение. Процессы, с которыми установлено подключение, останавливаются, прерывая любые ожидающие или текущие системные вызовы, которые разрешено прерывать. См. detach.

backtrace, bt, where, w

Выводит трассировку стека.

break, b

Устанавливает точку прерывания. Можно указать имя функции, номер строки текущего файла (файл, содержащий выполняемый в данный момент код), пару имя_файла:номер_строки или даже произвольный адрес с помощью *адрес.gdb назначает и выводит уникальный номер для каждой точки прерывания. См. condition, clear и delete.

clear

Удаляет точку прерывания. Принимает такой же аргумент, как break. См. delete.

condition

Изменяет точку прерывания, определенную номером (см. break), для прерывания, только если выражение истинно. Допускаются произвольные выражения.

(gdb) b664

Breakpoint 3 at 0х804а5с0: file ladsh4.c, line664.

(gdb) condition 3 status==0

delete

Удаляет точку прерывания, определенную номером.

detach

Отключается от текущего подключенного процесса.

display

Отображает значение выражения каждый раз при остановке выполнения. Принимает такие же аргументы (включая модификаторы формата), как print. Выводит номер отображения, которое впоследствии может использоваться для отмены отображения. См. undisplay.

Help

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

jump

Переходит на произвольный адрес и продолжает выполнение процесса с этой точки. Адрес — единственный аргумент; его можно определить в форме номера строки или адреса, указанного как *адрес.

list, l

Выданная без аргументов list сначала выводит 10 строк, расположенных возле текущего адреса. Последующие вызовы list выводят последующие 10 строк. При использовании аргумента - выводит предыдущие 10 строк. При указании номера строки выводит 10 строк, окружающих эту строку. При указании пары имя_файла:номер_строки выводит 10 строк, окружающих заданную. При указании имени функции выводит 10 строк возле начала функции. При указании адреса в виде *адрес выводит 10 строк, окружающих код, находящийся по этому адресу. При указании двух строк, разграниченных запятыми, выводит все строки между заданными.

next, n

Переходит на следующую строку исходного кода в текущей функции, без захода внутрь функций. См. step.

nexti

Переходит на следующую инструкцию машинного языка без захода внутрь функций. См. stepi.

print, p

Выводит значение выражения в понятной форме. Если есть переменная char* с, команда print с выведет адрес строки, a print *с выведет саму строку. Для структур выводятся их члены. Можно использовать приведения типов, которые gdb будет учитывать. Если код скомпилирован с опцией -ggdb, в выражениях станут доступны перечислимые значения и определения препроцессора. См. display. Команда print принимает идентификаторы формата, несмотря на то, что при указании и преобразовании типов идентификаторы формата зачастую не нужны. См. x.

run, r

Запускает текущую программу с начала. Аргументы команды run передаются в командную строку для запуска программы. В gdb, подобно оболочке, можно универсализировать имена файлов с помощью * и [], а также осуществлять переадресацию посредством <, > и >>, но нельзя создавать каналы или внутренние документы. Без аргументов run использует аргументы, которые были определены в самой последней команде run или set args. Для запуска без аргументов после их задействования используется команда set args без дополнительных аргументов.

set

gdb позволяет менять значения переменных, например:

(gdb) set а = argv[5]

Также каждый раз при выводе выражения с помощью print создается сокращенная переменная вроде $1, на которую впоследствии можно ссылаться. Таким образом, если ранее был выведен argv[5] и gdb указал на то, что результат сохранен в $6, можно переписать предыдущее присваивание так:

(gdb) set а = $6

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

step, s

Выполняет инструкции программы до достижения новой строки исходного кода. См. next.

stepi

Выполняет в точности одну инструкцию машинного языка; с заходом внутрь функций. См. nexti.

undisplay

Если выдана без аргумента, отменяет все отображения. В противном случае отменяет отображения указанные номерами. См. display.

whatis

Выводит тип данных выражения, переданного в качестве аргумента команды.

where, w

См. backtrace.

x

Команда x подобна print с тем исключением, что она явно ограничивается выводом содержимого по указанному адресу в произвольном формате. Если идентификатор формата не используется, gdb будет применять самый последний идентификатор из указанных.