[? ДАН ARMADARAS:] Привет, Я [? Дэн Armadaras?]. Сегодня мы собираемся искать при отладке. Не только мы будем говорить о некоторых методов, но также мы будем смотреть на некоторые из функций, содержащихся в CS50 IDE, которые позволяют Вы легко отлаживать программу. Только один пример то, что может пойти не так и это на самом деле что-то что мы уже видели раньше. В этом случае эта программа С который принимает целое число от пользователя, делит его на две части, и обеспечивает выход обратно пользователю. Теперь от того, что мы видели ранее в лекции, мы знаем, что это будет на самом деле причина конкретные типы проблем с делением когда у нас есть нечетные числа. В частности, мы просто выбросить нибудь после десятичной точки. Теперь мы знаем, что это бывает так. И если мы запустить его, мы можем подтвердить, наши подозрения, во-первых, компиляции. А потом, за счет выполнения и ввод нечетное число. В этом нет ничего нового. Но это на самом деле пример ошибка, может существовать в рамках более широкой программы что становится все труднее выследить. Даже если мы знаем, что вопрос есть истинный Суть дела может быть пытаются определить где конкретно происходит ошибка, Определение того, что эту проблему это, а затем ее фиксации. Так обеспечить это в качестве примера что может быть что-то что мы уже знаем, но может быть похоронен в других элементов кода. Так открытия этого другого источника код файла в качестве примера, эта проблема в настоящее время разделение частью более крупной программы. Еще может быть немного немного надуманный, и мы могли бы легко определить его, особенно так как мы как раз обсуждали это. Но мы можем понять, что это Проблема может существовать в более крупном масштабе. Если я скомпилировать и теперь запустить его, введите нечетное число, мы видим, что мы не получаем точно выход, что мы, возможно, ожидали. В данном конкретном случае, мы могли бы сказать, что мы хотите посчитать все номера от одного до некоторой определенного числа. И мы видим, что мы есть ряд вопросов, здесь, если мы вывода, просто, 0 и 1, когда мы обеспечиваем ввод 5. Таким образом, мы уже знаем, что есть проблема. Но мы не можем точно знать, где этот вопрос на самом деле существует. Теперь один из способов, который мы можем попытаться это исправить что-то, что мы уже были введены в. Мы можем просто использовать его в большем масштабе. На линии 14, мы имеем эта функция Printf, что позволяет распечатать государства различных частей информации. И это то, что вам должны использовать в своей программе чтобы попытаться выяснить, что именно это происходит в различных строк кода. Поэтому, даже если это не Окончательный результат, что мы действительно хотят производить из эта программа, мы по-прежнему возможно, некоторые отладки заявления, где мы можно попробовать выяснить, что именно что происходит внутри нашего кода. Таким образом, в этом случае, я буду PRINTF с отладки тега. В этом случае, это просто отладки строка что я до-сдачи, так что она становится очень ясно на выходе моего кода то, что это то, что я хочу показать. И выход здесь число что мы рассчитали. В этом случае, я мог бы хочу точно знать, что происходит до и после некоторого конкретного расчета. Так что я, возможно, использовать, прежде чем Printf и после этого строки кода. В этом случае, я мог даже сделать это немного более ясно, говоря отладку, прежде чем и отладки после так что я не путаю себя с несколько строк, которые выглядят идентично. Теперь, если мы перекомпилировать и запустить это это, введите номер как пять раз, мы видим, что у нас есть Теперь выход до и после и обнаружили, что мы не сделали ясно разделение или ясно, имеющий числа что мы на самом деле хотим сделать. В настоящее время в данном случае, это на самом деле не ясно выходной. Это на самом деле не ясно, что исход мы хотим от этой конкретной программы. И это, опять же, немного надуманный. Но, пожалуй, одна из вещей, которые мы могли бы сделать, если спецификация сказал что мы хотим разделить это, 2 и добавить 1-- так, другими словами, мы хотим, чтобы закруглить up-- то мы знали, что мы могли бы сделать это особое дело, в этом случае. Теперь вот мы знаем, что мы будем возможность добавить 1 к нашей вдвое числа. Давайте перекомпилировать это и подтвердить, что это ведет себя так, что мы этого хотим. Мы видим, что сейчас, прежде чем имея, у нас есть ряд 5. После, у нас есть число 3, которые в соответствии с нашей спецификации, это то, что мы хотели сделать. Но если мы посмотрим на Выход здесь, мы можем видеть, что мы могли бы иметь другой ошибка вообще, что что мы начинаем наш счет от 0. Теперь снова, это то, что мы видели в прошлом и мы можем исправить довольно легко. Но в данном случае, мы также имел преимущество использования PRINTF о непосредственно внутри для цикла чтобы точно знать, где что ошибка происходила. Так PRINTF заявления очень полезен в помощи Вы определить, где, именно в исходном коде, конкретная ошибка происходит. И это также важно понимать, что, как мы пишем код, мы могли бы предположения о состоянии программы. Или мы могли бы предположения о том, что часть программы на самом деле правильно или неправильно, когда позже, как мы строим по этой программе и сделать его частью более сложной и больше программа что мы понимаем, что некоторые аспекты того, что на самом деле ошибок. Использование Printf действительно может помочь сузить и определить регионы программы, которые не могут быть себя именно так, как мы ожидать, основываясь на наших предположениях. Но есть и другие инструменты доступны, а также, которые позволяют нам, чтобы попытаться выяснить , где ошибка происходит а также, в частности, какие вещи происходят внутри программы. Таким образом, используя Printf очень полезна, когда мы хотим определить конкретные области программа, которая есть ошибка. Но это также становится утомительно через некоторое время. В этом случае, это относительно простая программа с одной или двух переменных. И это становится очень легко для нас, чтобы распечатать значение этих переменных в более широком контексте программы. Но мы могли бы иметь разные Программа, которая имеет много переменных. И это может быть не совсем настолько прост в использовании Printf чтобы попытаться оценить то, что происходит в каждой из этих переменных как программа выполняется. Там это программа, которая существует называется программа отладчик. В этом случае тот, который мы будем использование отладчика GNU или GDB, что позволяет нам, чтобы осмотреть внутренний выработок программы в гораздо более подробно. Мы можем на самом деле выполнить GDB из командной строки здесь просто набрав GDB и Команда, что мы хотим, чтобы отладить. В этом случае, счет. В настоящее время в этом случае, мы видим, что это приводит нас к строке, которая говорит GDB. И мы действительно можем выполнить команды GDB на самом деле начать выполнение Программа, остановить его в определенных точках, оценить переменные и проверить переменные, которые существуют в Государственной программе в тот момент, и так далее и тому подобное. Это обеспечивает большую мощность для нас. Но так уж случилось, что CS50 IDE также предоставляет графический интерфейс пользователя или интерфейс для GDB, что позволяет нам сделать это без необходимости интерфейс командной строки вообще или вообще даже. Таким образом, что я могу получить доступ, что это с помощью кнопки отладки на самом верху CS50 IDE. В настоящее время в прошлом, что у нас есть видел, что мы используем команду Линия для компиляции, а затем запустите программу. Кнопка отладки делает оба этих шагов. Но это также будет воспитывать отладчик вкладка в дальнем правом что позволяет нам, чтобы осмотреть разнообразные свойств программы как это выполняется. Если я нажимаю отладки, в этом так, она будет воспитывать новая вкладка в консоли Окно в самом низу. И вы можете видеть, что эта вкладка имеет Некоторая информация на самом верху. И мы можем в значительной степени игнорировать это. Но одна из вещей, что мы хотим заметить, является то, что он выводит то же самое, что мы хотел бы получить, если бы мы пытались запустить сделать на Программа C в окне терминала. Здесь мы видим, что это работает лязг, и имеет различные флаги, и это компиляция наш count.c файл, который был в то время выделенная вкладка что я попал отладки. Так что это очень полезно, потому что Теперь с помощью этой кнопки отладки, мы можем одновременно скомпилировать, а затем выполнить программу, мы на самом деле хочу работать. Один из флагов, который является Важно, в данном случае, мы на самом деле использовали течение длительного периода времени но и просто сделал некоторые стороны размахивая [неразборчиво], которые это прямо здесь. В лязгом, это говорит -ggdb3. В этом случае, то, что мы рассказывая лязгом, наша компилятор, является то, что мы хотим, чтобы скомпилировать нашу программу. Но также обеспечить то, что являются называется символом информация так что компилятор на самом деле имеет доступ для многих основной информации содержащиеся в программе. Более конкретно, количество функций, которые у меня есть, имена тех функций, переменные, виды что эти переменные, и разнообразие других вещей, которые помогут отладчик выполняют свою работу. Теперь есть что-то еще это важно отметить, когда мы обсуждаем ход Программа таким образом. Обратите внимание, что на самом деле он имеет принес новую вкладку в нашей консоли по дну. Мы больше не должны взаимодействовать непосредственно в окно терминала. Но эта новая вкладка на самом деле окно терминала. Это просто специфичен для бега Программа, что мы создали. Обратите внимание, что в нижней части, в Сочетание с какой-то выход по лязг компилятор и GDB, которые мы можем в значительной степени игнорировать, это на самом деле показывает вывод наша программа на самом дне. Теперь важно понять, что это на самом деле одно окно покажет вам Выход из программы но также может принимать ввод для этой программы, а также. Так обратите внимание, что говорит Пожалуйста, введите номер, что тот же вывод, что у нас имел в окне терминала до. Но теперь показано в этой новой вкладке. Я могу ввести номер. И это будет на самом деле Функция, как мы ожидаем показывая нам наш отладки выход, выход, что может быть багги, как мы видели раньше. И в самом низу, его на самом деле имеет некоторые дополнительные выходные от ВВП просто говорю, что эта программа завершена. Теперь, как вы видели в этом частности пробегают, это не было особенно полезно, потому что даже хотя у нас были меню отладчика приходят до, это было еще работает программа. Ни в одной точке сделал это на самом деле приостановить выполнение для нас чтобы быть в состоянии проверить все переменные, содержащиеся в. Там что-то еще что мы должны сделать для того, чтобы получить GDB признать, что мы хотим чтобы приостановить выполнение программы а не просто позволить ей перейти Обычно, как мы бы в любом другом случае. Для того, чтобы приостановить выполнение, в какой-то конкретной линии, мы должны создать то, что называется точкой разрыва. И точка разрыва очень легко создать в этом CS50 IDE, принимая вашу мышь и нажав непосредственно слева некоторого определенного числа линий. После того, как я это сделаю, красная точка Оказывается, что указывает что эта линия сейчас точка разрыва. И в следующий раз, что я запустить GDB, его остановит выполнение в этой точке разрыва когда он достигает этого кода. Теперь это важный вещь, чтобы понять что это не обязательно так, что каждая строка кода на самом деле доступны. Если бы я был, чтобы создать функцию здесь, на example-- пустот F-- и просто сделать линию печати here-- привет world-- если я никогда не называют эту функцию, это будет тот случай, когда, если я установить точку останова здесь, функция никогда не будет вызвана. И, следовательно, это Точка разрыва частности никогда не будет на самом деле пауза выполнение программы. Так что давайте говорить, что я правильно создать точка разрыва на некотором строки кода что на самом деле будет выполняться. В настоящее время в данном случае, это Первая строка в главной функции. Так что, безусловно, будет случай что, как только я начинаю исполнение, самая первая строка будет достигнута. GDB будет приостановить выполнение. И тогда, я буду в состоянии взаимодействовать с отладчиком. Вы можете установить несколько строк, как точки останова, если вы хотели бы. Мы также можем создать линию до здесь, в этом сегменте кода что никогда не будет достигнута. И мы также можем установить одну ниже. Причина того, что мы бы хочу сделать это мы будем перейти в немного более деталь в минуту. Так что сейчас, позвольте мне просто отключить эти дополнительные точки останова так что мы можем смотреть на то, что происходит когда у меня есть один единственный перерыв точка в моей программе. Я сделал некоторые изменения в этой программе. Поэтому мне нужно, чтобы сохранить его. Я нажмите отладки, так, что я могу начать компиляцию, а затем выполнение отладчика. Мы увидим, что после моментов, в линия, что мы выбраны в качестве перерыва Точка будет выделен желтым цветом. Мы можем также заметить, что в верхний правый в панели отладки что значок паузы получилось в маленькую иконку игры. Это означает, что мы должны паузу Выполнение, в данном конкретном случае. И нажав кнопку Play будет позволяют возобновить выполнение в этой конкретной точке. Обратите внимание, что есть несколько других доступные в этом отладки панели кнопок, также. Шаг за, что позволяет мне выполнить эту одну строку кода и шаг к этой линии к Следующий, который, в данном случае, будет означать, что Printf оператор выполняется. И это будет пауза выполнение в строке 13, как это. И есть также шаг в функции, которая Полезно, если я создал другой функции в других местах в исходном коде. И я хочу, чтобы войти в эти функции, а не выполнить эту функцию в целом. Но мы более на стадии в функции в минуту. Теперь обратите внимание некоторые другие вещи, которые на самом деле существуют в этой отладки панели. У нас есть эта панель называется Стек вызовов, который показывает нам где именно мы находимся. В этом случае, мы находимся внутри из основной функции. Наш скрипт называется count.c. И мы оказались на строка 13, столбец одной, которая это именно то, что выделенная область исходного кода указывает, как хорошо. Теперь обратите внимание, что это также показывает, под местной переменного сечения все переменные, которые существуют в этой функции. Важно отметить, что все переменные появится в этой локальной переменной раздел внутри функции, еще до того, как они определены. Мы можем видеть здесь, что мы имеем переменную называется пит, по умолчанию имеет значение 0, и это типа Int. Теперь, прежде чем мы на самом деле инициализации все эти переменные, мы не обязательно гарантированно посмотреть значение 0. И в зависимости от других казней что вы выполнили и состояние вашей памяти, когда вы на самом деле запустить эту программу, Вы можете обнаружить, что вам не вижу значения 0 и, вместо этого, некоторые другие бредовые цифры. Но не беспокойтесь об этом. Это не собирается быть актуальными до вы на самом деле инициализации значения. В настоящее время в этом случае, мы можем видеть, что Я выполнил некоторые выходы. И я, прямо сейчас, остановился выполнение. Но в этом случае, то, что Я действительно хочу сделать является в настоящее время перешагнуть эту линию кода, так что я на самом деле могу запросить пользователя для этого Int, что мы хотим использовать в нашей программе. В настоящее время в этом случае, когда Я ударил перешагнуть, уведомление что пауза или, скорее, резюме Кнопка была изменена на этой кнопке Паузы Так как этот код в действительности выполняется. Что происходит прямо сейчас, что это нас ждет ввода некоторую информацию как мы видим наш вывода текста на самом дне. Так что сейчас, это на самом деле не остановился, даже если это, своего рода, появляется быть, потому что ничего не происходит. Но так уж случилось, что в мой конкретный случай в строке 13, Я жду пользовательского ввода. И так, GDB не в состоянии осмотреть программа, как это работает. Теперь в следующий раз, что я вхожу некоторые input-- поэтому я ввести этот номер 5, как мы видели в past-- удар Enter, и мы Обратите внимание, что сразу, GDB пауз и, опять же, подчеркивает следующую строку. Но обратите внимание, что в настоящее время, как Результат нашего ввода значения, мы обновили это значение внутри наших локальных переменных, которые очень полезно точно знать, что это число было в памяти. Теперь я могу позволить, чтобы эта программа по-прежнему не играет до конца его исполнения нажав Резюме. Мы видим, что очень быстро делает отделка программа выполнения с тем же, что выход раньше, отладчик закрывает, и в настоящее время эта программа полностью остановился. Я показываю, что только для Цели, видя, что происходит, когда мы на самом деле удар Резюме. Но мы на самом деле собираемся хочу вернуться в эту программу так что мы можем попытаться отладки именно то, что происходит. Теперь, когда я с помощью отладчика, я могу не нужны эти заявления отладки PRINTF. Так что я мог удалить их, как я буду делать Теперь просто вернемся к нашему простому коду что у нас был мгновение назад. Теперь, когда я сохранить программировать и выполнять его, это, опять же, пойти, что первоначальный точку останова, что у меня в строке 11. И я буду иметь возможность проверить мои переменные, как я хочу делать. Просто так случилось, что это часть не очень интересно, И я знаю, что я собираюсь распечатать это заявление. Пожалуйста, введите номер. А потом, я знаю, что я собираюсь спросить пользователя для этого целого. Так что, возможно, я на самом деле хочу, чтобы пошевелить Point Break немного дальше. Вы можете удалить точки останова нажав, опять же, напрямую слева от данной строки. Это красная точка исчезнет, ​​указывая что это точка разрыва в настоящее время нет. В настоящее время в этом случае, исполнение было приостановлено. И таким образом, это на самом деле не собирается резюме в этом конкретном случае. Но я могу установить перерыв указывают немного позже. И когда сейчас я возвращаюсь к своим Код, он возобновит и сказать точка этой точки останова. Опять же, я ударил Резюме. Не похоже, что-то происходит. Но это потому, что моя код ожидает ввода. Я введите номер 5, нажмите Ввод и Теперь следующий момент перерыва будет удар. В настоящее время в данном случае, это это строка кода что, прежде чем мы знали, оказался багги. Итак, давайте оценивать то, что происходит в этом конкретный момент времени. Когда строка будет выделена, это линия еще не была выполнена. Таким образом, в этом случае, мы можем видеть, что у меня есть номер, который У меня есть целое число, называемое Num, что имеет значение 5. И я собираюсь сделать некоторые математические на это число. Если я перешагнуть, что мы можем Обратите внимание, что значение для пит изменилось в соответствии с арифметика, что мы на самом деле сделали. И теперь, когда мы внутри этого цикла для или теперь, когда цикл Сам выделен, мы видим, что у нас есть новый Переменная называется I, что будет использоваться в том, что цикл. Теперь вспомните, до этого я отметил, что иногда вы увидите какой-то сумасшедший числа как по умолчанию до этого числа или, что переменная на самом деле инициализации. Мы можем видеть, что именно здесь, в этой переменной называется I, которые не имеет пока был инициализирован во время выделения. Но мы видим, что она имеет некоторое количество что мы не на самом деле ожидать. Ничего страшного. Не беспокойтесь об этом потому что у нас на самом деле не не инициализирован это число до I шаг на эту линию, а значение я был инициализирован к значению 1. Так, чтобы увидеть, что это на самом деле так, давайте перешагнуть. Теперь мы можем видеть, что, что Линия была выполнена. И мы сейчас выделяя это Printf линии. А теперь мы видим, как наши ценности из я и 3 были изменены с течением времени. Это очень полезно, чтобы сделать, по сути, это перешагнуть линии несколько раз. И вы можете найти то, что на самом деле происходит внутри вашего цикла для и то, что происходит с переменные внутри цикла, что для как то выполнение программы происходит один шаг в то время. Сейчас на этом месте, я перешагнул достаточно просто что я сейчас в конце моей программы. Если я перешагнуть, что это будет на самом деле прекратить выполнение как мы видели в прошлом. Позвольте мне перезагрузить это, еще раз, так что что я могу указать что-то еще из, также. В этом случае, это теперь просят меня, опять же, для ряда, который Я, опять же, войти. Но в этот раз, я иду, чтобы войти в большее количество, так что цикл будет повторять несколько раз. В этом случае, я собираюсь ввести значение 11. Теперь снова, потому что я установить точка разрыва на линии 15, он собирается выделить эту строку. Мы видим, что наши № 11 правильно представлена ​​в наших локальных переменных. Переступив через это, мы теперь можем смотреть, что происходит с нашей стоимости I а мы переходим в это цикл. Он получает приращение каждый раз, когда мы достичь вершины, что для цикла. Теперь одна из вещей, которые могли бы полезно сделать во время выполнения этой программы для меня на самом деле изменить переменные переправе, чтобы увидеть что происходит с моей программы. В этом случае, я на самом деле могу дважды щелкните значение. Обратите внимание, что это становится текстовое поле. Теперь я могу ввести разные цените вообще чтобы увидеть, как ведет себя моя программа когда я изменил эту переменную. В настоящее время в этом случае, переменная Теперь я содержит значение 10. Но программа еще остановился в исполнении. Когда я перешагнуть, я вижу, что Значение я, что я вошел в 10, не больше, чем значение пит, который сразу же вызывает цикл , чтобы остановить выполнение. Теперь это не только Причина, почему вы хотите изменить переменную на месте. Вы могли бы на самом деле хотят чтобы попытаться изменить его так, что вы можете продолжать выполнение цикла или так, что вы можете изменить некоторое значение перед ним достигает некоторого определенного набора арифметических что вы собираетесь выполнять. Так что теперь мы на самом деле изменить значение я, как программы выполнял, это вызвало цикл бросить преждевременно, потому что, вдруг, я оказалась больше, чем значение из пит, это означает, что что для цикла больше не нужны для выполнения. Кроме того, оказалось, был так, что мы изменили значение I когда была подчеркнута линия 17, который был момент времени что для выполнения цикла на самом деле оценивается. Если бы я изменил значение я на другой линии, скажем, 19, мы видели разные поведение, потому что линия 19 будет выполнили перед циклом условие перепроверены. Сейчас на этом месте, я, опять же, В конце этой программы. И я могу допустить, чтобы это приступить к позволяют моя программа бросить естественно. Но есть несколько вещей, которые имеют важное значение, чтобы забрать именно из этого обсуждения. Вы должны оценить Ваши собственные предположения о том, как код должен быть себя. Каждый раз, когда вы думаете, что некоторые кусок из кода вы знаете, случается, работают, что может быть красный флаг, чтобы пойти назад и оценить, и быть уверенным, что вступлением как этот код работает на самом деле так, как это выражается в исходном коде. Но еще больше было точки, когда мы используем отладчик, Вы можете поместить точки останова различные строки кода, что вызовет отладчик для приостановить выполнение на каждой из этих линий так что вы можете оценить памяти или даже изменить его на месте. И снова, помните, что вы можете создать несколько точек останова, так что вы Также можно возобновить выполнение, пропустить на больших участках кода, и это автоматически паузу в следующей точке разрыва. Там на самом деле более продвинутый особенности отладчика, а также. Но мы должны направить вас в некоторых последующих видео для того, чтобы действительно дразнить друг от друга, как использовать эти конкретные функции. Сейчас, спасибо очень подходит для просмотра. И хорошо отладки удачи.