Что такое отладчик GNU?
Отладчик — это программа, которая запускает другие программы, позволяя пользователю контролировать эти программы и проверять переменные при возникновении проблем.
Отладчик GNU, также называемый gdb, является наиболее популярным отладчиком для систем UNIX для отладки программ на C и C ++.
GNU Debugger поможет вам получить информацию о следующем:
-
Если произошел дамп ядра, то при каком операторе или выражении произошел сбой программы?
-
Если во время выполнения функции возникает ошибка, какая строка программы содержит вызов этой функции и каковы параметры?
-
Каковы значения переменных программы в определенной точке во время выполнения программы?
-
Каков результат определенного выражения в программе?
Если произошел дамп ядра, то при каком операторе или выражении произошел сбой программы?
Если во время выполнения функции возникает ошибка, какая строка программы содержит вызов этой функции и каковы параметры?
Каковы значения переменных программы в определенной точке во время выполнения программы?
Каков результат определенного выражения в программе?
Как отладить GDB?
GDB позволяет вам запустить программу до определенной точки, затем остановить и распечатать значения определенных переменных в этой точке или выполнить пошаговое выполнение программы по одной строке за раз и распечатать значения каждой переменной после выполнения каждой строки.
GDB использует простой интерфейс командной строки.
Указывает на заметку
-
Хотя GDB может помочь вам обнаружить ошибки, связанные с утечкой памяти, но это не инструмент для обнаружения утечек памяти.
-
GDB нельзя использовать для программ, которые компилируются с ошибками, и это не помогает исправлять эти ошибки.
Хотя GDB может помочь вам обнаружить ошибки, связанные с утечкой памяти, но это не инструмент для обнаружения утечек памяти.
GDB нельзя использовать для программ, которые компилируются с ошибками, и это не помогает исправлять эти ошибки.
GDB — Установка
Перед тем, как приступить к установке, проверьте, установлен ли у вас gdb в вашей системе Unix, введя следующую команду:
$gdb -help
Если GDB установлен, он отобразит все доступные опции в вашей GDB. Если GDB не установлен, перейдите к новой установке.
Вы можете установить GDB в вашей системе, выполнив простые шаги, описанные ниже.
Шаг 1: Убедитесь, что у вас есть необходимые условия для установки GDB:
-
ANSI-совместимый компилятор C (рекомендуется gcc — обратите внимание, что gdb может отлаживать коды, сгенерированные другими компиляторами)
-
115 МБ свободного дискового пространства требуется на разделе, на котором вы собираетесь создать GDB.
-
20 МБ свободного дискового пространства требуется на том разделе, на котором вы собираетесь установить GDB.
-
Программа распаковки GNU, gzip
-
Утилита make — известно, что версия GNU работает без проблем, другие, вероятно, также работают.
ANSI-совместимый компилятор C (рекомендуется gcc — обратите внимание, что gdb может отлаживать коды, сгенерированные другими компиляторами)
115 МБ свободного дискового пространства требуется на разделе, на котором вы собираетесь создать GDB.
20 МБ свободного дискового пространства требуется на том разделе, на котором вы собираетесь установить GDB.
Программа распаковки GNU, gzip
Утилита make — известно, что версия GNU работает без проблем, другие, вероятно, также работают.
Шаг 2. Загрузите исходный код gdb с ftp.gnu.org/gnu/gdb. (Мы использовали gdb-6.6.tar.gz для этих инструкций.) Поместите файлы дистрибутива в ваш каталог сборки.
Шаг 3: В вашей сборочной директории распакуйте gdb-6.6.tar.gz и извлеките исходные файлы из архива. Как только файлы будут извлечены, измените свой рабочий каталог на каталог gdb-6.6, который был автоматически создан в вашем каталоге сборки.
$ build> gzip -d gdb-6.6.tar.gz $ build> tar xfv gdb-6.6.tar $ build> cd gdb-6.6
Шаг 4: Запустите скрипт configure для настройки дерева исходных текстов для вашей платформы.
$ gdb-6.6> .⁄configure
Шаг 5: Сборка GDB с помощью утилиты make .
$ gdb-6.6> make
Шаг 6: Войдите в систему как root и установите gdb, используя следующую команду.
$ gdb-6.6> make install
Шаг 7: При необходимости, дисковое пространство можно восстановить, удалив каталог сборки gdb и файл архива после завершения установки.
$ gdb-6.6> cd .. $ build> rm -r gdb-6.6 $ build> rm gdb-6.6.tar
Теперь в вашей системе установлен gdb, и он готов к использованию.
GDB — символы отладки
Таблица символов отладки отображает инструкции в скомпилированной двоичной программе на соответствующие им переменные, функции или строки в исходном коде. Это отображение может быть что-то вроде:
-
Программная инструкция ⇒ имя элемента, тип элемента, исходный файл, номер строки.
Программная инструкция ⇒ имя элемента, тип элемента, исходный файл, номер строки.
Таблицы символов могут быть встроены в программу или сохранены в виде отдельного файла. Поэтому, если вы планируете отлаживать свою программу, то необходимо создать таблицу символов, которая будет содержать необходимую информацию для отладки программы.
Мы можем вывести следующие факты о таблицах символов:
-
Таблица символов работает для определенной версии программы — если программа изменяется, новая таблица должна быть создана.
-
Отладочные сборки часто больше и медленнее, чем обычные (не отладочные); отладочные сборки содержат таблицу символов и другую вспомогательную информацию.
-
Если вы хотите отладить бинарную программу, которую вы не скомпилировали самостоятельно, вы должны получить таблицы символов у автора.
Таблица символов работает для определенной версии программы — если программа изменяется, новая таблица должна быть создана.
Отладочные сборки часто больше и медленнее, чем обычные (не отладочные); отладочные сборки содержат таблицу символов и другую вспомогательную информацию.
Если вы хотите отладить бинарную программу, которую вы не скомпилировали самостоятельно, вы должны получить таблицы символов у автора.
Чтобы GDB мог читать всю эту информацию построчно из таблицы символов, нам нужно скомпилировать ее немного по-другому. Обычно мы компилируем наши программы как:
gcc hello.cc -o hello
Вместо этого нам нужно скомпилировать с флагом -g, как показано ниже:
gcc -g hello.cc -o hello
GDB — Команды
GDB предлагает большой список команд, однако чаще всего используются следующие команды:
-
b main — ставит точку останова в начале программы
-
b — ставит точку останова на текущей строке
-
b N — ставит точку останова на линии N
-
b + N — переводит точку останова на N строк ниже текущей
-
b fn — ставит точку останова в начале функции «fn»
-
d N — удаляет точку останова номер N
-
информационный перерыв — список точек останова
-
r — запускает программу до точки останова или ошибки
-
c — Продолжает запуск программы до следующей точки останова или ошибки
-
f — выполняется до завершения текущей функции
-
s — запускает следующую строку программы
-
s N — запускает следующие N строк программы
-
n — как s, но не входит в функции
-
U N — работает, пока вы не получите N строк перед текущей строкой
-
p var — печатает текущее значение переменной «var»
-
bt — печатает трассировку стека
-
u — поднимается на уровень в стеке
-
d — понижается на уровень в стеке
-
q — Выход из GDB
b main — ставит точку останова в начале программы
b — ставит точку останова на текущей строке
b N — ставит точку останова на линии N
b + N — переводит точку останова на N строк ниже текущей
b fn — ставит точку останова в начале функции «fn»
d N — удаляет точку останова номер N
информационный перерыв — список точек останова
r — запускает программу до точки останова или ошибки
c — Продолжает запуск программы до следующей точки останова или ошибки
f — выполняется до завершения текущей функции
s — запускает следующую строку программы
s N — запускает следующие N строк программы
n — как s, но не входит в функции
U N — работает, пока вы не получите N строк перед текущей строкой
p var — печатает текущее значение переменной «var»
bt — печатает трассировку стека
u — поднимается на уровень в стеке
d — понижается на уровень в стеке
q — Выход из GDB
GDB — отладка программ
Начало работы: запуск и остановка
-
gcc -g myprogram.c
-
Компилирует myprogram.c с опцией отладки (-g). Вы все еще получаете a.out, но он содержит отладочную информацию, которая позволяет вам использовать переменные и имена функций внутри GDB, а не сырые области памяти (не весело).
-
-
GDB a.out
-
Открывает GDB с файлом a.out, но не запускает программу. Вы увидите приглашение (GDB) — все примеры из этого приглашения.
-
-
р
-
r arg1 arg2
-
г <файл1
-
Три способа запуска «a.out», загруженные ранее. Вы можете запустить его напрямую (r), передать аргументы (r arg1 arg2) или передать файл. Обычно вы устанавливаете контрольные точки перед запуском.
-
-
Помогите
-
ч точки останова
-
Списки справочных тем (help) или получение справки по конкретной теме (h контрольных точек). ГБД хорошо документировано.
-
-
q — Выйти из GDB
gcc -g myprogram.c
Компилирует myprogram.c с опцией отладки (-g). Вы все еще получаете a.out, но он содержит отладочную информацию, которая позволяет вам использовать переменные и имена функций внутри GDB, а не сырые области памяти (не весело).
GDB a.out
Открывает GDB с файлом a.out, но не запускает программу. Вы увидите приглашение (GDB) — все примеры из этого приглашения.
р
r arg1 arg2
г <файл1
Три способа запуска «a.out», загруженные ранее. Вы можете запустить его напрямую (r), передать аргументы (r arg1 arg2) или передать файл. Обычно вы устанавливаете контрольные точки перед запуском.
Помогите
ч точки останова
Списки справочных тем (help) или получение справки по конкретной теме (h контрольных точек). ГБД хорошо документировано.
q — Выйти из GDB
Пошаговое выполнение кода
Шаги позволяют отслеживать путь к вашей программе и сосредоточиться на коде, который дает сбой или возвращает неверный ввод.
-
L
-
л 50
-
я моя функция
-
Перечисляет 10 строк исходного кода для текущей строки (l), конкретной строки (l 50) или для функции (l myfunction).
-
-
следующий
-
Запускает программу до следующей строки, затем делает паузу. Если текущая строка является функцией, она выполняет всю функцию, затем приостанавливается. Далее хорошо для быстрого просмотра вашего кода.
-
-
шаг
-
Запускает следующую инструкцию, а не строку. Если текущая инструкция устанавливает переменную, она такая же, как следующая . Если это функция, она перейдет в функцию, выполнит первый оператор, затем сделает паузу. шаг хорош для того, чтобы погрузиться в детали вашего кода.
-
-
Конец
-
Завершает выполнение текущей функции, затем приостанавливается (также называется выходом). Полезно, если вы случайно вошли в функцию.
-
L
л 50
я моя функция
Перечисляет 10 строк исходного кода для текущей строки (l), конкретной строки (l 50) или для функции (l myfunction).
следующий
Запускает программу до следующей строки, затем делает паузу. Если текущая строка является функцией, она выполняет всю функцию, затем приостанавливается. Далее хорошо для быстрого просмотра вашего кода.
шаг
Запускает следующую инструкцию, а не строку. Если текущая инструкция устанавливает переменную, она такая же, как следующая . Если это функция, она перейдет в функцию, выполнит первый оператор, затем сделает паузу. шаг хорош для того, чтобы погрузиться в детали вашего кода.
Конец
Завершает выполнение текущей функции, затем приостанавливается (также называется выходом). Полезно, если вы случайно вошли в функцию.
Точки останова или наблюдения
Точки останова играют важную роль в отладке. Они приостанавливают (ломают) программу, когда она достигает определенной точки. Вы можете просматривать и изменять переменные и возобновлять выполнение. Это полезно, когда происходит сбой какого-либо входа или если входы должны быть проверены.
-
перерыв 45
-
сломать мою функцию
- Устанавливает точку останова в строке 45 или в myfunction. Программа остановится, когда достигнет точки останова.
-
смотреть х == 3
-
Устанавливает точку наблюдения, которая приостанавливает программу при изменении условия (при изменении x == 3). Точки наблюдения отлично подходят для определенных входов (myPtr! = NULL) без необходимости прерывать каждый вызов функции.
-
-
Продолжить
-
Возобновляет выполнение после приостановки точкой останова / наблюдения. Программа будет продолжаться, пока не достигнет следующей точки останова / наблюдения.
-
-
удалить N
- Удаляет точку останова N (точки останова нумеруются при создании).
перерыв 45
сломать мою функцию
смотреть х == 3
Устанавливает точку наблюдения, которая приостанавливает программу при изменении условия (при изменении x == 3). Точки наблюдения отлично подходят для определенных входов (myPtr! = NULL) без необходимости прерывать каждый вызов функции.
Продолжить
Возобновляет выполнение после приостановки точкой останова / наблюдения. Программа будет продолжаться, пока не достигнет следующей точки останова / наблюдения.
удалить N
Установка переменных
Просмотр и изменение переменных во время выполнения является важной частью отладки. Попробуйте указать недопустимые входные данные для функций или запустить другие тестовые примеры, чтобы найти основную причину проблем. Как правило, вы будете просматривать / устанавливать переменные, когда программа приостановлена.
-
печать х
-
Печатает текущее значение переменной x. Возможность использовать оригинальные имена переменных — вот почему необходим флаг (-g); Программы, составленные регулярно, удаляют эту информацию.
-
-
установить х = 3
-
установить х = у
- Устанавливает x в установленное значение (3) или в другую переменную (y)
-
позвоните myfunction ()
-
позвоните в мою другую функцию (х)
-
Звоните Стрлен (Mystring)
-
Вызывает пользовательские или системные функции. Это чрезвычайно полезно, но остерегайтесь вызова функций с ошибками.
-
-
дисплей х
-
Постоянно отображается значение переменной x, которое отображается после каждого шага или паузы. Полезно, если вы постоянно проверяете определенное значение.
-
-
не показывать x
- Удаляет постоянное отображение переменной, отображаемой командой display.
печать х
Печатает текущее значение переменной x. Возможность использовать оригинальные имена переменных — вот почему необходим флаг (-g); Программы, составленные регулярно, удаляют эту информацию.
установить х = 3
установить х = у
позвоните myfunction ()
позвоните в мою другую функцию (х)
Звоните Стрлен (Mystring)
Вызывает пользовательские или системные функции. Это чрезвычайно полезно, но остерегайтесь вызова функций с ошибками.
дисплей х
Постоянно отображается значение переменной x, которое отображается после каждого шага или паузы. Полезно, если вы постоянно проверяете определенное значение.
не показывать x
Возврат и изменение кадров
Стек — это список текущих вызовов функций — он показывает, где вы находитесь в программе. Во фрейме хранятся сведения об одном вызове функции, например аргументы.
-
Б.Т.
-
Возвращает или печатает текущий стек функций, чтобы показать, где вы находитесь в текущей программе. Если основные вызовы функции a (), которая вызывает b (), которая вызывает c (), обратная трассировка
-
Б.Т.
Возвращает или печатает текущий стек функций, чтобы показать, где вы находитесь в текущей программе. Если основные вызовы функции a (), которая вызывает b (), которая вызывает c (), обратная трассировка
c <= current location b a main
вверх
вверх
вниз
-
Перейти к следующему кадру вверх или вниз в стеке функций. Если вы находитесь в c, вы можете перейти к b или a, чтобы проверить локальные переменные.
вниз
Перейти к следующему кадру вверх или вниз в стеке функций. Если вы находитесь в c, вы можете перейти к b или a, чтобы проверить локальные переменные.
вернуть
- Возвращает из текущей функции.
вернуть
Обработка сигналов
Сигналы — это сообщения, генерируемые после определенных событий, таких как таймер или ошибка. GDB может останавливаться, когда встречает сигнал; вы можете игнорировать их.
-
обрабатывать [имя сигнала] [действие]
-
ручка SIGUSR1 ностоп
-
ручка SIGUSR1 нопринт
-
обрабатывать SIGUSR1 игнорировать
-
Поручите GDB игнорировать определенный сигнал (SIGUSR1) при его возникновении. Существуют разные уровни игнорирования.
-
обрабатывать [имя сигнала] [действие]
ручка SIGUSR1 ностоп
ручка SIGUSR1 нопринт
обрабатывать SIGUSR1 игнорировать
Поручите GDB игнорировать определенный сигнал (SIGUSR1) при его возникновении. Существуют разные уровни игнорирования.
GDB — Примеры отладки
Просмотрите следующие примеры, чтобы понять процедуру отладки программы и сброшенного ядра.
-
Этот пример демонстрирует, как вы бы зафиксировали ошибку, которая происходит из-за исключения, возникшего при делении на ноль.
-
В этом примере демонстрируется программа, которая может выгружать ядро из-за неинициализированной памяти.
Этот пример демонстрирует, как вы бы зафиксировали ошибку, которая происходит из-за исключения, возникшего при делении на ноль.
В этом примере демонстрируется программа, которая может выгружать ядро из-за неинициализированной памяти.
Обе программы написаны на C ++ и генерируют дамп ядра по разным причинам. После ознакомления с этими двумя примерами вы сможете отлаживать программы на C или C ++, генерирующие дампы ядра.
ГБД — Резюме
Изучив это руководство, вы, должно быть, хорошо разбираетесь в отладке программ на C или C ++ с использованием отладчика GNU. Теперь вам будет очень легко изучить функциональность других отладчиков, потому что они очень похожи на GDB. Настоятельно рекомендуется пройти через другие отладчики, чтобы ознакомиться с их функциями.
На рынке доступно немало хороших отладчиков:
-
Отладчик DBX. Этот отладчик поставляется вместе с Sun Solaris, и вы можете получить полную информацию об этом отладчике, используя страницу справочника dbx, то есть man dbx .
-
DDD Debugger — это графическая версия dbx, свободно доступная в Linux. Чтобы получить полную информацию, используйте man-страницу ddd, то есть man ddd .
Отладчик DBX. Этот отладчик поставляется вместе с Sun Solaris, и вы можете получить полную информацию об этом отладчике, используя страницу справочника dbx, то есть man dbx .
DDD Debugger — это графическая версия dbx, свободно доступная в Linux. Чтобы получить полную информацию, используйте man-страницу ddd, то есть man ddd .
Вы можете получить подробную информацию о GNU Debugger по следующей ссылке: Отладка с помощью GDB