[? ДАН 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, просто натисніть Enter і Тепер наступний момент перерви буде удар. В даний час в даному випадку, це це рядок коду що, перш ніж ми знали, виявився баггі. Отже, давайте оцінювати те, що відбувається в цьому конкретний момент часу. Коли рядок буде виділений, це лінія ще не була виконана. Таким чином, в цьому випадку, ми можемо бачити, що у мене є номер, який У мене є ціле число, зване Num, що має значення 5. І я збираюся зробити деякі математичні на це число. Якщо я переступити, що ми можемо Зверніть увагу, що значення для піт змінилося відповідно до арифметика, що ми насправді зробили. І тепер, коли ми всередині цього циклу для або тепер, коли цикл Сам виділений, ми бачимо, що у нас є новий Мінлива називається I, що буде використовуватися в тому, що цикл. Тепер згадайте, до цього я зазначив, що іноді ви побачите якийсь божевільний числа як за замовчуванням до цього числа або, що змінна насправді ініціалізації. Ми можемо бачити, що саме тут, в цій змінній називається I, які не має поки був инициализирован під час виділення. Але ми бачимо, що вона має деяку кількість що ми не насправді очікувати. Все добре. Не турбуйтеся про це тому що у нас насправді не НЕ инициализирован це число до I крок на цю лінію, а значення я був инициализирован до значення 1. Так, щоб побачити, що це насправді так, давайте переступити. Тепер ми можемо бачити, що, що Лінія була виконана. І ми зараз виділяючи це Printf лінії. А тепер ми бачимо, як наші цінності з я і 3 були змінені з плином часу. Це дуже корисно, щоб зробити, по суті, це переступити лінії кілька разів. І ви можете знайти те, що насправді відбувається всередині вашого циклу для і те, що відбувається з змінні всередині циклу, що для як то виконання програми відбувається один крок в той час. Зараз на цьому місці, я переступив досить просто що я зараз в кінці моєї програми. Якщо я переступити, що це буде насправді припинити виконання як ми бачили в минулому. Дозвольте мені перезавантажити це, ще раз, так що що я можу вказати щось ще з, так само. У цьому випадку, це тепер просять мене, знову ж, для ряду, який Я, знову ж, увійти. Але цього разу, я йду, щоб увійти в більшу кількість, так що цикл буде повторювати кілька разів. У цьому випадку, я збираюся ввести значення 11. Тепер знову, тому що я встановити точка розриву на лінії 15, він збирається виділити цей рядок. Ми бачимо, що наші № 11 правильно представлена ​​в наших локальних змінних. Переступивши через це, ми тепер можемо дивитися, що відбувається з нашою вартістю I а ми переходимо в це цикл. Він отримує прирощення кожен раз, коли ми досягти вершини, що для циклу. Тепер одна з речей, які могли б корисно зробити під час виконання цієї програми для мене насправді змінити змінні переправі, щоб побачити що відбувається з моєї програми. У цьому випадку, я насправді можу двічі клацніть значення. Зверніть увагу, що це стає текстове поле. Тепер я можу ввести різні цінуєте взагалі щоб побачити, як поводиться моя програма коли я змінив цю змінну. В даний час в цьому випадку, змінна Тепер я містить значення 10. Але програма ще зупинився у виконанні. Коли я переступити, я бачу, що Значення я, що я ввійшов до 10, не більш, ніж значення піт, який відразу ж викликає цикл , Щоб зупинити виконання. Тепер це не тільки Причина, чому ви хочете змінити змінну на місці. Ви могли б насправді хочуть щоб спробувати змінити його так, що ви можете продовжувати виконання циклу або так, що ви можете змінити деяке значення перед ним досягає деякого певного набору арифметичних що ви збираєтеся виконувати. Так що тепер ми насправді змінити значення я, як програми виконував, це викликало цикл кинути передчасно, тому що, раптом, я виявилася більшою, ніж значення з піт, це означає, що що для циклу більше не потрібні для виконання. Крім того, виявилося, був так, що ми змінили значення I коли була підкреслена лінія 17, який був момент часу що для виконання циклу насправді оцінюється. Якби я змінив значення я на іншій лінії, скажімо, 19, ми бачили різні поведінку, тому що лінія 19 буде виконали перед циклом умова переперевірені. Зараз на цьому місці, я, знову ж таки, Наприкінці цієї програми. І я можу допустити, щоб це приступити до дозволяють моя програма кинути природно. Але є кілька речей, які мають важливе значення, щоб забрати саме з цього обговорення. Ви повинні оцінити Ваші власні припущення про те, як код повинен бути себе. Кожен раз, коли ви думаєте, що деякі шматок з коду ви знаєте, трапляється, працюють, що може бути червоний прапор, щоб піти назад і оцінити, і бути впевненим, що вступом як цей код працює насправді так, як це виражається у вихідному коді. Але ще більше було точки, коли ми використовуємо відладчик, Ви можете помістити точки зупину різні рядки коду, що викличе відладчик для призупинити виконання на кожній з цих ліній так що ви можете оцінити пам'яті або навіть змінити його на місці. І знову, пам'ятайте, що ви можете створити кілька точок зупину, так що ви Також можна відновити виконання, пропустити на великих ділянках коду, і це автоматично паузу в наступній точці розриву. Там насправді більш просунутий особливості відладчика, а також. Але ми повинні направити вас в деяких наступних відео для того, щоб дійсно дражнити один від одного, як використовувати ці конкретні функції. Зараз, спасибі дуже підходить для перегляду. І добре налагодження удачі.