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
Вот как всё это должно выглядеть в окне терминала:

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

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

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

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

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

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

ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
run 13
Может, имелось в видуrun 3
? Или 1 - это argv[0] в данном случае, а 3 - это argv[1]?