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), когда он возникает. Есть разные уровни игнорирования.