Улучшите качество кода и предотвратите непредвиденные результаты, научившись использовать отладчик GNU для выявления нежелательных ошибок в вашем коде.
Отладка — незаменимый навык для программистов и исследователей безопасности. Хорошее понимание отладки позволяет вам понять исполняемый файл на более низком уровне и обнаружить любые скрытые ошибки.
Отладчик GNU или GDB — это вечный инструмент отладки, на который программисты полагаются уже много лет. Вот как использовать GDB в Linux.
Подготовка примеров программ
Чтобы изучить возможности GDB, вам понадобится исполняемый файл для экспериментов. Для демонстрации вы запустите GDB в программе проверки ключей один раз с доступным исходным кодом и символами отладки, один раз без исходный код и простую многопоточную программу, выводящую на экран сообщения, написанные на C и скомпилированные с помощью GCC (GNU C Компилятор).
Ты можешь используйте любой другой компилятор C но убедитесь, что не удалите двоичный файл.
Скорее всего, вы будете использовать GDB в своих собственных программах. Поэтому обязательно скомпилируйте их с помощью
-г флаг с gcc, чтобы включить символы отладки.Без присутствия символов отладки и с сильно урезанным двоичным файлом вам придется отлаживать дизассемблирование программы. Для этого вам потребуется хорошее знание языка ассемблера и как работает распределение памяти в Linux понимать данные в стеке и регистрах.
Запуск программы в GDB
Вы запускаете программу в GDB несколькими способами. Либо введите БДБ , и как только он загрузится, введите бегать. Или запустите GDB, а затем используйте файл команду, загрузите двоичный файл в GDB, а затем выполните его с помощью бегать команда.
Если для правильной работы вашей программы требуются аргументы командной строки, обязательно добавляйте аргументы после имени программы. Вот синтаксис загрузки программы в GDB и ее выполнения с аргументами:
gdb
run
Или:
gdb
file
run
Установка точек останова с помощью GDB
Точки останова при отладке — это вручную устанавливаемые в коде жесткие остановки, которые останавливают поток выполнения, когда программа достигает точки останова. Установка точек останова позволяет вам пошагово выполнять код и проверять, как каждый этап выполнения влияет на данные и переменные.
В GDB, когда вы отлаживаете программу с помощью символов отладки, вы можете либо установить точку останова по имени функции, либо установить точку останова на основе номера строки. Вот синтаксис:
break main
break 47
Чтобы просмотреть все точки останова в текущем сеансе отладки, введите:
info breakpoints
Чтобы удалить определенную точку останова или несколько точек останова, введите:
delete 2
delete 3-5
GDB также позволяет вам устанавливать условные точки останова, то есть программа остановится только в том случае, если во время выполнения будет выполнено определенное условие. Это может быть изменение значения переменной или неудачный вызов функции, или что угодно. Вот синтаксис для установки условных точек останова:
break if n == 2
Если вы хотите продолжить выполнение программы после достижения точки останова, введите команду продолжать команда:
continue
Шаг по коду
Пошаговый анализ кода имеет решающее значение для понимания того, как программа обрабатывает данные. Выполняя различные функции вашей программы и исследуя состояние данных, вы можете лучше понять, как программа реализует логику, которую вы написали в коде.
Это также помогает вам обнаружить причину сбоев и изучить поведение программы с хирургической точностью, поскольку вы можете выполнять каждую строку кода по своему усмотрению. В GDB вы можете выполнять код тремя основными способами:
- шаг: Эта команда сообщает GDB перейти к следующей строке исходного файла. Это позволяет вам построчно перемещаться по длине исходного кода.
- следующий: Эта команда выполняет следующую строку исходного кода внутри текущей функции, а затем останавливается. следующий рассматривает функцию как одну строку, поэтому, если вы используете next перед вызовом функции, она будет рассматривать ее как одну строку и переходить через нее, в отличие от шаг команда.
- заканчивать: Команда завершения выполняет все оставшиеся строки внутри текущей функции, а затем останавливается.
Исследование переменных
По ходу выполнения кода вам захочется проверить значения переменных, чтобы увидеть, как логика программы их меняет. Вот синтаксис для просмотра значений переменных в GDB:
print
Если вы хотите печатать изменения значения переменной каждый раз, когда она обновляется, вам следует использовать команду display. Это особенно полезно, когда вы хотите отслеживать и печатать значение переменной в цикле:
display
Установка точек наблюдения
Точки наблюдения и условные точки останова тесно связаны, поскольку они оба реагируют на изменения в программе. Точки наблюдения используются для отслеживания изменений данных в коде. Например, вы можете захотеть, чтобы программа прерывалась при каждом изменении значения переменной. Вот как это сделать с помощью GDB:
watch
Потокоспецифичная отладка с помощью GDB
GDB позволяет выполнять отладку отдельных потоков при работе с многопоточными программами. Для демонстрации мы будем работать с простой программой на языке C, которая использует четыре потока для печати сообщений в каждом потоке.
Чтобы просмотреть текущие потоки, созданные в вашей программе, используйте команду Информация команда:
info threads
Для работы с конкретным потоком вы можете выбрать его из списка по его порядковому номеру. Например:
thread 2
После выбора потока вы можете пройти через поток его выполнения, используя шаг, следующий, и заканчивать команды, как показано выше.
Удаленная отладка с помощью GDB
Вы также можете удаленно отлаживать программы, расположенные в другой системе. Для этого вам необходимо настроить gdbserver на целевой машине. Вы можете легко установить его, используя менеджер пакетов по умолчанию вашего дистрибутива или другие менеджеры пакетов, которые вы установили в вашей системе.
Например, чтобы установить gdbserver в системах на базе Ubuntu или Debian, используйте APT:
sudo apt install gdbserver
После установки перейдите в папку с двоичным файлом и выполните следующую команду, чтобы запустить gdbserver:
gdbserver :
gdbserver должен вернуть вывод о том, что он работает и прослушивает определенный вами порт. Теперь на клиентском компьютере запустите GDB, а затем подключитесь к удаленному серверу, используя команду цель команда:
target remote :
Написание сценариев GDB для автоматизации отладки
GDB позволяет программистам писать сценарии GDB, которые будут автоматически выполнять команды GDB. Это очень помогает, когда вы пытаетесь отлаживать одну и ту же часть кода несколько раз. Вместо того, чтобы устанавливать точку останова, выполнять код и печатать значения переменных каждый раз при загрузке двоичного файла, вы можете использовать сценарий GDB для автоматизации всего процесса.
Вот пример:
set logging enabled on
set logging file sample.out
break main
command 1
backtrace
print N
continue
end
quit
В приведенном выше сценарии вы указываете GDB включить ведение журнала и сохранить его в файл с именем образец.выход, затем установите точку останова в основной функция.
Для точки останова номер 1, в данном случае точки останова в функции main, выполните следующие команды: обратная трассировка, Распечатать, продолжать. По сути, GDB сначала запускает обратную трассировку, затем печатает значение переменной «N», продолжает выполнение и, наконец, завершает работу.
Чтобы выполнить этот скрипт, используйте:
gdb -x