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