GDB относится к «умным» программам-отладчикам, то есть таким, которые «понимают» код и умеют выполнять его построчно, менять значения переменных, устанавливать контрольные точки и условия остановки… Словом, делать всё для того, чтобы разработчик мог проверить правильность работы своей программы.

GDB встроен во многие UNIX-подобные системы и умеет производить отладку нескольких языков программирования. Си — в их числе.

Чтобы вызвать GDB введите в терминале команду

gdb [имя_программы_которую_вы_хотите_отладить]

Чтобы выйти из GDB: введите команду

quit или С –d

Другие важные команды GDB

run [аргументы командной строки программы]
Запустить программу на выполнение.
break [номер строки / имя функции]
Установить точку остановки программы на определенной строке или функции.
next
Перейти на следующую строку, не заходя внутрь функций.
step
Перейти на следующую строку. Если на строке вызов функции - зайти внутрь нее.
list
Вывести фрагмент кода программы (несколько строк вокруг того места, где сейчас установлена точка)
print [переменная]
Вывести значение переменной на экран.
info locals
Вывести текущие значения всех локальных переменных внутри цикла, функции и так далее.
display [переменная]
Вывести значение переменной на каждом шаге отладки.
help
Показать список всех команд GDB.

Давайте посмотрим, как работать с GDB на примере программы caesar.c, которую вы, скорее всего уже написали на прошлой неделе. Проверять будем на собственной версии, так что у вас результаты могут несколько отличаться в зависимости от реализации.

Итак, переходим в папку pset2 (думаем, вы уже помните, как это сделать) в «Виртуальной лаборатории cs50» или CS50 IDE. Вводим команду:

gdb ./caesar

В программе caesar есть одна функция, main. Установим точку остановки программы на функции main:

break main

Запустим программу caesar с аргументом «3»:

run 13

Допустим, нам надо проверить значение argc:

print argc

Вот как всё это должно выглядеть в окне терминала:

Отладчик GDB - 1

Теперь выполняем программу пошагово с помощью команды next. Выполним несколько раз.

Отладчик GDB - 2

Здесь переменной key присваивают значение. Проверим, какое значение она имеет этой строке:

Отладчик GDB - 3

При первом вызве next переменной key присваивается значение «0». ПОчему так, если мы ввели число 3? Дело в том, что команда ещё не была выполнена. Когда вы вводим next ещё несколько раз, программа предлагает ввести текст.

Отладчик GDB - 4

Выполнив команду next еще раз, мы зайдем внутрь цикла с условием:

Отладчик GDB - 5

Как программа должна выполняться дальше? Чтобы узнать это, нам нужно пересмотреть значение всех локальных переменных (существующих в рамках цикла) с помощью info locals

Условие будет выполнено, и, введя next еще несколько раз, мы выполним инструкции внутри цикла, и окажемся в начале следующей итерации цикла. Обратите внимание, что значение переменной text изменилось.

Отладчик GDB - 6

Посмотрим код у той строки, где мы остановились с помощью команды list:

Отладчик GDB - 7