Книга: Разработка приложений в среде Linux. Второе издание
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
будет применять самый последний идентификатор из указанных.
- Appendix I. GNU General Public License
- Отладчик kdb
- 15.5.2. Отладчики выделения памяти
- 15.5.2.5. Другие отладчики malloc
- 1.4. GNU-отладчик gdb
- 1.4.2. Запуск отладчика
- Appendix H. GNU Free Documentation License
- 1.3. Автоматизация процесса с помощью GNU-утилиты make
- The GNU Image Manipulation Program
- 8.5. Обход дерева файлов: GNU du
- GNU Emacs and the Free Software Foundation
- Проект GNU и Фонд свободного ПО