ДАГ 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.