ДАГ Lloyd: Ладно GDB. Что именно? Так, GDB, который стоит для GNU Debugger, это действительно удивительный инструмент, который мы можем использовать, чтобы помочь нам отладки наших программ, или узнать, где вещи происходит не так в наших программах. GDB удивительно мощный, но выход и взаимодействие с ним может быть немного загадочным. Это, как правило, это инструмент командной строки, и он может бросить много сообщений на вас. А может это своего рода трудно разобрать, что именно происходит. К счастью, мы предприняли шаги чтобы исправить эту проблему для вас как вы работаете через CS50. Если вы не используете графический отладчик, который мой коллега Дэн Armandarse говорил вполне немного о в видео, должно быть здесь Прямо сейчас, вы, возможно, потребуется использовать эти командную строку инструменты для работы с GDB. Если вы работаете в CS50 IDE, вам не нужно делать это. Но если вы не работает в CS50 IDE, возможно, с использованием версии из CS50 Appliance, или эксплуатации другая Linux Система с GDB установлен на нем, Вы можете нужно использовать эти инструменты командной строки. И так как вы можете нужно сделать это, это полезно просто чтобы понять, как GDB работает из командной строки. Но, опять же, если вы с помощью CS50 IDE, вы можно использовать графический отладчик который построен в IDE. Таким образом, чтобы получить вещи, идущие с GDB, чтобы начать отладку Процесс конкретный Программа, все, что вам нужно сделать, это ввести GDB с последующим по имени программы. Так, например, если ваша программа привет, вы должны ввести GDB привет. Когда вы сделаете это, вы будете подтянуть окружающей среды GDB. Ваш запрос будет изменить, и вместо того, чтобы то, что его, как правило, когда вы набираете вещи В командной line-- Ls, cd-- все ваш типичный Линукс команд, ваш запрос изменится на, вероятно, что-то как скобках GDB скобки. Это ваш новый быстрое GDB, потому что Вы находитесь внутри среды GDB. После того, как внутри этой среды, есть две основные команды что вы, вероятно, использовать в следующем порядке. Во-первых, B, который короткий для перерыва. И после того, как Type B, как правило, вы введите имя функции, или если вы не знаете, вокруг того, что номер строки Ваша программа начинает вести себя немного странным, Вы можете ввести строку Количество там также. Что б, или перерыв, делает это позволяет вашу программу не подбежать до определенного момента, а именно, имя функции что вы указать или линия номер, который вы укажете. И в тот момент, это будет заморозить выполнение. Это действительно хорошая вещь, потому что когда исполнение было заморожено, Вы можете начать очень медленно пошагово вашей программе. Как правило, если вы были работает Ваши программы, они довольно короткие. Как правило, при вводе точка слэш все имя вашей программы, хит Enter, и прежде чем вы можете мигать, ваш Программа уже готова. Это на самом деле не очень много времени, чтобы попытаться и выяснить, что происходит не так. Так что на самом деле, чтобы быть в состоянии замедлить вещи вниз, установив точку останова с б, а затем вмешалась в. Тогда, как только вы установите ваш отдых точка, вы можете запустить программу. И если у вас есть Аргументы командной строки, указать их здесь, а не когда вводе GDB ваше имя программы. Вы указываете все командную строку Аргументы, принимая г, или бег, а затем аргументы командной строки все Вы должны внутри вашей программы. Есть ряд других очень важные и полезные команды внутри среды ВВП. Так позвольте мне быстро перейти некоторые из них. Первый п, короткий на следующий, и вы можете ввести следующий вместо п, как будет работать. И это только сокращение. И, как вы уже, наверное, получили раньше, будучи в состоянии набрать вещи короче, как правило, лучше. И что он будет делать это буду шаг вперед, один блок кода. Так что будем двигаться вперед до вызова функции. И тогда вместо того, дайвинг в этой функции и переживает все, что функции Код, он просто будет иметь функцию. Функция будет называться. Он будет делать то, что его работа. Это вернет значение функция, которая называется его. И тогда вы будете переходить к Следующая строка этой вызывающей функции. Если вы хотите, чтобы шаг внутри функции, а просто имея это выполнить, особенно если вы думаете, что проблема может лежать внутри этой функции, Вы могли бы, конечно, установить перерыв точка внутри этой функции. Или, если вы уже работает, можно, использовать S к шагу вперед одну строку кода. Так что это будет шаг в и нырять в функции, а не просто иметь выполнить и продолжая в функции что вы находитесь в для отладки. Если вы когда-нибудь хотели знать, значение переменной, Вы можете ввести р, или печать, а затем имя переменной. И это будет распечатать для вас, внутри среды GDB, имя переменной, что you-- извините me-- значение переменной что вы назвали. Если вы хотите знать значения каждый локальная переменная доступна, откуда Вы в настоящее время в вашей Программа, вы можете ввести Информация местных жителей. Это намного быстрее, чем набрав р, а затем все, что, список из всех из переменные, которые вы знаете, существуют. Вы можете ввести Информация местных жителей, и это выведет все для вас. Далее идет BT, которая Короче для обратной трассировки. Теперь, как правило,, особенно в начале CS50, вы не будете действительно иметь случай использовать BT, или обратной трассировки, потому что вы, не имея функции что вызывать другие функции. Вы, возможно, главный вызову Функция, но это, вероятно, это. Вы не имеют, что другие функции вызов другой функции, которая вызывает другую функцию, и так далее. Но, как ваши программы получить больше Комплекс, в частности, когда вы начинаете работать с рекурсией, назад след может быть действительно полезный способ, чтобы вы получить вид некоторый контекст для того, где Я в моей программе. Так, вы написали код, и Вы знаете, что основная вызывает функцию е, что вызывает функцию г, что вызывает функцию час. Таким образом, мы имеем несколько слоев гнездования здесь происходит. Если вы внутри среда, GDB и вы знаете, ваш внутри Н, но вы забыли о том, что есть ты, где вы are-- вы можете ввести BT, или обратной трассировки, и это будет распечатать ч, г, е главный, наряду некоторой другой информации, которая дает подсказку, что, главным ОК называется F, F называется г, г называется ч, и это, где я В настоящее время нахожусь в моей программе. Так что может быть очень полезно, особенно загадочным-Несс в GDB становится немного подавляющим, чтобы выяснить, где именно вещи. Наконец, когда ваша программа выполняется, или когда вы закончите ее отладки и вы хотите, чтобы отойти из окружающей среды GDB, он помогает узнать, как выйти из него. Вы можете ввести д или Выход, чтобы выйти. Теперь, прежде чем сегодня видео Я подготовил программу багги называется buggy1, который я составил из файла, известного как buggy1.c. Как вы могли бы ожидать, это Программа на самом деле багги. Что-то идет не так когда я пытаюсь и запустить его. Сейчас, к сожалению, я нечаянно удален buggy1.c файл, так для меня, чтобы выяснить, что происходит не так с этой программой, Я собираюсь должны использовать GDB вид вслепую, пытаясь для навигации по этой программе выяснить, что именно происходит не так. Но, используя только инструменты мы уже узнали о, мы можем довольно много фигуру что именно оно и есть. Итак, давайте над головой CS50 IDE и посмотрите. ОК, так что мы здесь, в моем CS50 IDE среда, и я буду увеличивать немного так что вы можете увидеть немного больше. В моем окне терминала, если я перечисляю содержимое моего нынешнего директора с Ls, мы увидим, что я есть пара исходных файлов Здесь, в том числе обсуждалось ранее buggy1. Что именно происходит, когда Я стараюсь и запустите buggy1. Ну, давайте выясним. Я типа точка слэш, багги, и я ударил Enter. Сегментирование неисправностей. Это не хорошо. Если вы Напомним, Сегментация вина, как правило, происходит, когда мы получаем доступ к памяти что мы не разрешается прикасаться. Мы как-то добраться вне границ что программа, тем компилятор, дал нам. И так уже, что это ключ к держать в панели инструментов мы начинаем процесс отладки. Что-то пошло немного неправильно здесь. Ладно, так что давайте начнем до среды GDB и посмотреть, если мы можем выяснить, что именно проблема. Я собираюсь очистить экран, и я собираюсь ввести GDB снова, чтобы войти в среду GDB, и имя программы что я хочу, чтобы отладить, buggy1. Мы получаем небольшое сообщение, читая , сделано символы из buggy1. Все это означает, что он вытащил это вместе весь код, и теперь он был загружен в GDB, и он готов к работе. Теперь, что я хочу сделать? Помнишь вам, что Первый шаг, как правило, является после я внутри этой среды? Надеюсь, вы сказали, установить точка разрыва, потому что в том, что то, что я хочу сделать. Теперь, я не имеют Исходный код для этого передо мной, что, вероятно, не типичный случай использования, кстати. Вы, наверное, будет. Так что это хорошо. Но если вы этого не сделаете, то, что один функция, что вы знаете существует в каждой отдельной программе C? Независимо от того, насколько велика или насколько сложным это, безусловно, эта функция существует. Главная, верно? Так неудачу всего, мы можем установить точку останова на главной. И снова, я бы просто напечатать разговора Основное, вместо б. А если вам интересно, если вы либо введите длинную команду а затем осознать, что вас набрали неправильную вещь, и вы хотите, чтобы избавиться всего, как я только что сделал, Вы можете принять управление U, который будет удалить все и вернуться обратно в начале линии курсора. Гораздо быстрее, чем просто держать вниз удалять или наезд кучу раз на. Таким образом, мы установили точку останова на главной. И, как вы можете видеть, это говорит, что мы имею установить точку останова на файл buggy1.c, и, видимо, первая линия из кода главное, линия семь. Опять же, мы не должны исходный файл здесь, но я буду считать, что это говорит мне правду. И потом, я просто пытаюсь и запустить программу, г. Начиная программу. Ладно, так что это сообщение немного загадочными. Но в основном то, что что здесь происходит, это просто говорит мне, что я ударил перерыв Точка, точка разрыва номер 1. А потом, что строка кода, Данный файл или каталог отсутствует. Единственная причина, что Я вижу, что сообщение потому, что я невольно удален buggy.c файл. Если мой buggy1.c файл существует в текущем каталоге, что линия тут фактически скажи мне, что строка кода буквально читает. К сожалению, я удалил его. Мы собираемся иметь, чтобы перемещаться вид через это немного больше вслепую. Итак, давайте посмотрим, что я хочу сделать здесь? Ну, я хотел бы знать, что местный переменные, может быть, доступных мне. Я начал мою программу. Давайте посмотрим, что может быть уже инициализирован для нас. Я печатаю информация местных жителей, ни местных жителей. Ладно, так что не дать мне тонны информации. Я мог бы попробовать и распечатать переменную, но я не знаю, какие имена переменных. Я мог бы попробовать назад след, но я внутри основной, так что я знаю, что не сделал другой вызов прямо сейчас функция. Так выглядит только мои варианты использовать п или так и начать погружаться в. Я собираюсь использовать п. Так что я типа N. О, черт возьми, что здесь происходит. Программа получила сигналы, SIGSEGV сегментация вина, а затем целая куча вещей. Я уже перегружены. Ну, на самом деле можно многому научиться здесь. Итак, что же это нам говорит? Что это говорит нам о том, эта программа о, но имеет еще нет, SEG вина. И в частности, я собираюсь для увеличения еще дальше здесь, это собирается SEG неисправность о то, что называется зЬгстр. Теперь, мы не можем обсудили Эта функция широко. Но это потому, что is-- мы не собираемся говорить о том, что все функции существует в стандарте C library-- но все они доступны для вас, особенно, если вы берете посмотреть на reference.cs50.net. И зЬгстр это действительно мощный функция, которая существует внутри в заголовке string.h Файл, который представляет собой заголовок файл, который посвящен функций что работа с и манипулировать строк. И в частности, то, что делает зЬгстр он сравнивает значения двух строк. Так и я о сегментации вину на призыв STRCMP кажется. Я ударил п, а на самом деле я получаю сообщение, Программа завершается с сигналом SIGSEGV Сегментация вина. А сейчас Я на самом деле SEG нарушенными, и моя программа имеет довольно много эффективно отказали. Это конец программы. Это сломался, он разбился. Так что не было много, но я на самом деле узнать совсем немного из этого мало опыта. Что я узнал? Ну, моя программа падает в значительной степени немедленно. Моя программа не работает на позвоните чтобы STRCMP, но я не имеют никаких локальных переменных в моем Программа в то время, он падает. Так что строка или строки, я мог бы сравнивая. Если я не любая локальная переменные, вы можете предположить, что я, может быть, have-- есть это глобальная переменная, которая может быть правдой. Но в целом, кажется, как я сравниваю к чему-то, что не существует. Так что давайте исследовать что немного дальше. Так что я собираюсь очистить экран. Я собираюсь бросить из ряда GDB среда на секунду. И я думал, хорошо, так что нет локальные переменные в моей программе. Интересно, если возможно, я должен пройти в строке в качестве аргумента командной строки. Так что давайте просто проверить это. Я не сделал этого раньше. Давайте посмотрим, если возможно, если я запускаю эту программу с аргументом командной строки работает. Да, нет ошибки сегментации там. Это просто сказал мне, что я понял это. Так, может быть, это исправление здесь. И в самом деле, если я иду назад и посмотреть на фактический исходный код для buggy1.c, кажется, как будто то, что я делаю, Я делаю вызов STRCMP без проверки, является ли ARGV [1] существует на самом деле. Это на самом деле Исходный код для buggy1.c. Так что я действительно нужно сделать здесь, чтобы исправить мою программу, предполагая, у меня есть подать передо мной, является просто добавить проверку, чтобы уверен, что ARGC равно 2. Так что это пример, опять же, как я уже сказал, немного надуманный, верно? Вы обычно не собирается случайно удалить исходный код а затем попробовать и отладить программу. Но, надеюсь, это дало Вы иллюстрацией из тех вещей, что Вы могли бы думать о а вы отладки программы. Что состояние дел здесь? Какие переменные ли я есть доступным для меня? Где именно моя программа грохот, на какой линии, на то, что призыв к какой функции? Какие улики дает ли это мне? И это именно вид мышления, что вам должны получать в когда вы думать о отладки программ. Я Дуг Ллойд. Это CS50.