1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> ДАГ Lloyd: Гаразд GDB. 3 00:00:06,830 --> 00:00:08,480 Що саме? 4 00:00:08,480 --> 00:00:11,310 Так, GDB, який стоїть для GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 це дійсно дивовижний інструмент, який ми можемо використовувати, щоб допомогти нам налагодження наших програм, 6 00:00:15,040 --> 00:00:18,210 або дізнатися, де речі відбувається не так у наших програмах. 7 00:00:18,210 --> 00:00:22,590 GDB дивно потужний, але вихід і взаємодія з ним 8 00:00:22,590 --> 00:00:23,830 може бути трохи загадковим. 9 00:00:23,830 --> 00:00:28,210 Це, як правило, це інструмент командного рядка, і він може кинути багато повідомлень на вас. 10 00:00:28,210 --> 00:00:31,144 А може це свого роду важко розібрати, що саме відбувається. 11 00:00:31,144 --> 00:00:33,560 На щастя, ми зробили кроки щоб виправити цю проблему для вас 12 00:00:33,560 --> 00:00:36,281 як ви працюєте через CS50. 13 00:00:36,281 --> 00:00:39,030 Якщо ви не використовуєте графічний відладчик, який мій колега Ден 14 00:00:39,030 --> 00:00:41,570 Armandarse говорив цілком трохи про у відео, 15 00:00:41,570 --> 00:00:44,740 повинно бути тут Прямо зараз, ви, можливо, буде потрібно 16 00:00:44,740 --> 00:00:48,270 використовувати ці командний рядок інструменти для роботи з GDB. 17 00:00:48,270 --> 00:00:51,250 Якщо ви працюєте в CS50 IDE, вам не потрібно робити це. 18 00:00:51,250 --> 00:00:53,550 Але якщо ви не працює в CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 можливо, з використанням версії з CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 або експлуатації інша Linux Система з GDB встановлений на ньому, 21 00:00:58,860 --> 00:01:00,980 Ви можете потрібно використовувати ці інструменти командного рядка. 22 00:01:00,980 --> 00:01:02,860 >> І так як ви можете потрібно зробити це, це 23 00:01:02,860 --> 00:01:06,280 корисно просто щоб зрозуміти, як GDB працює з командного рядка. 24 00:01:06,280 --> 00:01:09,650 Але, знову ж, якщо ви за допомогою CS50 IDE, ви 25 00:01:09,650 --> 00:01:15,400 можна використовувати графічний відладчик який побудований в IDE. 26 00:01:15,400 --> 00:01:18,750 Таким чином, щоб отримати речі, що йдуть з GDB, щоб почати налагодження 27 00:01:18,750 --> 00:01:21,220 Процес конкретний Програма, все, що вам потрібно зробити, 28 00:01:21,220 --> 00:01:23,810 це ввести GDB з подальшим на ім'я програм. 29 00:01:23,810 --> 00:01:28,620 Так, наприклад, якщо ваша програма привіт, ви повинні ввести GDB привіт. 30 00:01:28,620 --> 00:01:31,210 >> Коли ви зробите це, ви будете підтягнути довкілля GDB. 31 00:01:31,210 --> 00:01:33,800 Ваш запит буде змінити, і замість того, щоб те, що його, як правило, 32 00:01:33,800 --> 00:01:35,841 коли ви набираєте речі У командному line-- Ls, 33 00:01:35,841 --> 00:01:38,115 cd-- все ваш типовий Лінукс команд, ваш запит 34 00:01:38,115 --> 00:01:42,200 зміниться на, ймовірно, щось як дужках GDB дужки. 35 00:01:42,200 --> 00:01:46,630 Це ваш новий швидке GDB, бо Ви знаходитесь усередині середовища GDB. 36 00:01:46,630 --> 00:01:49,830 Після того, як всередині цього середовища, є дві основні команди 37 00:01:49,830 --> 00:01:52,290 що ви, ймовірно, використовувати в наступному порядку. 38 00:01:52,290 --> 00:01:55,200 >> По-перше, B, який короткий для перерви. 39 00:01:55,200 --> 00:01:58,690 І після того, як Type B, як правило, ви введіть ім'я функції, 40 00:01:58,690 --> 00:02:01,040 або якщо ви не знаєте, навколо того, що номер рядка 41 00:02:01,040 --> 00:02:04,100 Ваша програма починає вести себе трохи дивним, 42 00:02:04,100 --> 00:02:06,370 Ви можете ввести рядок Кількість там також. 43 00:02:06,370 --> 00:02:09,660 Що б, або перерву, робить це дозволяє вашу програму 44 00:02:09,660 --> 00:02:13,270 НЕ підбігти до певного моменту, а саме, ім'я функції 45 00:02:13,270 --> 00:02:15,880 що ви вказати або лінія номер, який ви вкажете. 46 00:02:15,880 --> 00:02:18,590 >> І в той момент, це буде заморозити виконання. 47 00:02:18,590 --> 00:02:21,670 Це дійсно хороша річ, тому що коли виконання було заморожено, 48 00:02:21,670 --> 00:02:25,214 Ви можете почати дуже повільно покроково вашій програмі. 49 00:02:25,214 --> 00:02:28,130 Як правило, якщо ви були працює Ваші програми, вони досить короткі. 50 00:02:28,130 --> 00:02:31,250 Як правило, при введенні точка слеш всі ім'я вашої програми, хіт Enter, 51 00:02:31,250 --> 00:02:33,470 і перш ніж ви можете блимати, ваш Програма вже готова. 52 00:02:33,470 --> 00:02:36,620 Це насправді не дуже багато часу, щоб спробувати і з'ясувати, що відбувається не так. 53 00:02:36,620 --> 00:02:40,920 Так що насправді, щоб бути в змозі сповільнити речі вниз, встановивши точку зупину з б, 54 00:02:40,920 --> 00:02:43,040 а потім втрутилася в. 55 00:02:43,040 --> 00:02:46,169 >> Тоді, як тільки ви встановите ваш відпочинок точка, ви можете запустити програму. 56 00:02:46,169 --> 00:02:47,960 І якщо у вас є Аргументи командного рядка, 57 00:02:47,960 --> 00:02:51,610 вказати їх тут, а не коли введенні GDB ваше ім'я програми. 58 00:02:51,610 --> 00:02:55,980 Ви вказуєте всі командний рядок Аргументи, приймаючи г, або біг, 59 00:02:55,980 --> 00:03:00,270 а потім аргументи командного рядка всі Ви повинні всередині вашої програми. 60 00:03:00,270 --> 00:03:03,510 Є ряд інших дуже важливі і корисні команди 61 00:03:03,510 --> 00:03:04,970 всередині середовища ВВП. 62 00:03:04,970 --> 00:03:07,540 Так дозвольте мені швидко перейти деякі з них. 63 00:03:07,540 --> 00:03:11,320 >> Перший п, короткий на наступний, і ви можете ввести наступний замість п, 64 00:03:11,320 --> 00:03:12,304 як буде працювати. 65 00:03:12,304 --> 00:03:13,470 І це тільки скорочення. 66 00:03:13,470 --> 00:03:17,540 І, як ви вже, напевно, отримали раніше, будучи в змозі набрати речі 67 00:03:17,540 --> 00:03:20,520 коротше, як правило, краще. 68 00:03:20,520 --> 00:03:24,100 І що він буде робити це буду крок вперед, один блок коду. 69 00:03:24,100 --> 00:03:26,170 Так що будемо рухатися вперед до виклику функції. 70 00:03:26,170 --> 00:03:28,350 І тоді замість того, дайвінг в цій функції 71 00:03:28,350 --> 00:03:33,130 і переживає все, що функції Код, він просто буде мати функцію. 72 00:03:33,130 --> 00:03:34,400 >> Функція буде називатися. 73 00:03:34,400 --> 00:03:35,733 Він буде робити те, що його робота. 74 00:03:35,733 --> 00:03:38,870 Це поверне значення функція, яка називається його. 75 00:03:38,870 --> 00:03:42,490 І тоді ви будете переходити до Наступний рядок цієї викликає функції. 76 00:03:42,490 --> 00:03:44,555 Якщо ви хочете, щоб крок всередині функції, 77 00:03:44,555 --> 00:03:46,430 а просто маючи це виконати, особливо 78 00:03:46,430 --> 00:03:50,004 якщо ви думаєте, що проблема може лежати всередині цієї функції, 79 00:03:50,004 --> 00:03:52,670 Ви могли б, звичайно, встановити перерву точка всередині цієї функції. 80 00:03:52,670 --> 00:03:57,820 Або, якщо ви вже працює, можна, використовувати S до кроку вперед один рядок коду. 81 00:03:57,820 --> 00:04:01,170 >> Так що це буде крок у і пірнати у функції, 82 00:04:01,170 --> 00:04:04,750 а не просто мати виконати і продовжуючи у функції 83 00:04:04,750 --> 00:04:07,380 що ви перебуваєте в для налагодження. 84 00:04:07,380 --> 00:04:09,870 Якщо ви коли-небудь хотіли знати, значення змінної, 85 00:04:09,870 --> 00:04:12,507 Ви можете ввести р, або друк, а потім ім'я змінної. 86 00:04:12,507 --> 00:04:15,090 І це буде роздрукувати для вас, всередині середовища GDB, 87 00:04:15,090 --> 00:04:19,110 ім'я змінної, що you-- вибачте me-- значення змінної 88 00:04:19,110 --> 00:04:20,064 що ви назвали. 89 00:04:20,064 --> 00:04:23,230 Якщо ви хочете знати значення кожен локальна змінна доступна, звідки 90 00:04:23,230 --> 00:04:25,970 Ви в даний час у вашій Програма, ви можете ввести Інформація місцевих жителів. 91 00:04:25,970 --> 00:04:28,332 Це набагато швидше, ніж набравши р, а потім все, що, 92 00:04:28,332 --> 00:04:30,540 список з усіх з змінні, які ви знаєте, існують. 93 00:04:30,540 --> 00:04:34,370 Ви можете ввести Інформація місцевих жителів, і це виведе все для вас. 94 00:04:34,370 --> 00:04:37,770 Далі йде BT, яка Коротше для зворотного трасування. 95 00:04:37,770 --> 00:04:41,680 Тепер, як правило ,, особливо на початку CS50, 96 00:04:41,680 --> 00:04:44,450 ви не будете дійсно мати випадок використовувати BT, або зворотного трасування, 97 00:04:44,450 --> 00:04:47,860 тому що ви, не маючи функції що викликати інші функції. 98 00:04:47,860 --> 00:04:50,450 >> Ви, можливо, головний викликом Функція, але це, ймовірно, це. 99 00:04:50,450 --> 00:04:53,199 Ви не мають, що інші функції виклик іншої функції, яка 100 00:04:53,199 --> 00:04:54,880 викликає іншу функцію, і так далі. 101 00:04:54,880 --> 00:04:57,550 Але, як ваші програми отримати більше Комплекс, зокрема, 102 00:04:57,550 --> 00:05:00,290 коли ви починаєте працювати з рекурсією, назад слід 103 00:05:00,290 --> 00:05:05,150 може бути дійсно корисний спосіб, щоб ви отримати посвідку деякий контекст для того, де 104 00:05:05,150 --> 00:05:06,460 Я в моїй програмі. 105 00:05:06,460 --> 00:05:10,590 Так, ви написали код, і Ви знаєте, що основна викликає функцію 106 00:05:10,590 --> 00:05:14,720 е, що викликає функцію г, що викликає функцію годину. 107 00:05:14,720 --> 00:05:17,650 Таким чином, ми маємо декілька шарів гніздування тут відбувається. 108 00:05:17,650 --> 00:05:19,440 >> Якщо ви всередині Середа, GDB 109 00:05:19,440 --> 00:05:21,640 і ви знаєте, ваш всередині Н, але ви забули 110 00:05:21,640 --> 00:05:27,210 про те, що є ти, де ви are-- ви можете ввести BT, або зворотного трасування, 111 00:05:27,210 --> 00:05:32,370 і це буде роздрукувати год, г, е головний, поряд деякої іншої інформації, яка 112 00:05:32,370 --> 00:05:35,984 підказує, що, головним ОК називається F, F називається г, г називається год, 113 00:05:35,984 --> 00:05:37,900 і це, де я В даний час перебуваю в моїй програмі. 114 00:05:37,900 --> 00:05:41,380 Так що може бути дуже корисно, особливо загадковим-Несс в GDB 115 00:05:41,380 --> 00:05:45,667 стає трохи переважною, щоб з'ясувати, де саме речі. 116 00:05:45,667 --> 00:05:48,500 Нарешті, коли ваша програма виконується, або коли ви закінчите її налагодження 117 00:05:48,500 --> 00:05:50,125 і ви хочете, щоб відійти з навколишнього середовища GDB, 118 00:05:50,125 --> 00:05:51,940 він допомагає дізнатися, як вийти з нього. 119 00:05:51,940 --> 00:05:55,500 Ви можете ввести д або Вихід, щоб вийти. 120 00:05:55,500 --> 00:05:59,220 Тепер, перш ніж сьогодні відео Я підготував програму баггі 121 00:05:59,220 --> 00:06:03,900 називається buggy1, який я склав з файлу, відомого як buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Як ви могли б очікувати, це Програма насправді баггі. 123 00:06:06,500 --> 00:06:08,990 Щось іде не так коли я намагаюся і запустити його. 124 00:06:08,990 --> 00:06:13,014 Зараз, на жаль, я ненавмисно видалений buggy1.c файл, 125 00:06:13,014 --> 00:06:15,930 так для мене, щоб з'ясувати, що відбувається не так з цією програмою, 126 00:06:15,930 --> 00:06:18,770 Я збираюся повинні використовувати GDB вид наосліп, намагаючись 127 00:06:18,770 --> 00:06:22,372 для навігації по цій програмі з'ясувати, що саме відбувається не так. 128 00:06:22,372 --> 00:06:24,580 Але, використовуючи тільки інструменти ми вже дізналися про, 129 00:06:24,580 --> 00:06:27,700 ми можемо досить багато фігуру що саме воно і є. 130 00:06:27,700 --> 00:06:30,740 Отже, давайте над головою CS50 IDE і подивіться. 131 00:06:30,740 --> 00:06:33,155 ОК, так що ми тут, в моєму CS50 IDE середу, 132 00:06:33,155 --> 00:06:35,697 і я буду збільшувати трохи так що ви можете побачити трохи більше. 133 00:06:35,697 --> 00:06:38,530 У моєму вікні терміналу, якщо я перераховую вміст мого нинішнього директора 134 00:06:38,530 --> 00:06:41,250 з Ls, ми побачимо, що я є пара вихідних файлів 135 00:06:41,250 --> 00:06:44,982 Тут, у тому числі обговорювалося раніше buggy1. 136 00:06:44,982 --> 00:06:46,940 Що саме відбувається, коли Я намагаюся і запустіть buggy1. 137 00:06:46,940 --> 00:06:47,773 Ну, давайте з'ясуємо. 138 00:06:47,773 --> 00:06:52,510 Я типу точка слеш, баггі, і я вдарив Enter. 139 00:06:52,510 --> 00:06:53,670 >> Сегментування несправностей. 140 00:06:53,670 --> 00:06:55,000 Це не добре. 141 00:06:55,000 --> 00:06:57,180 Якщо ви Нагадаємо, Сегментація вина, як правило, 142 00:06:57,180 --> 00:07:01,540 відбувається, коли ми отримуємо доступ до пам'яті що ми не дозволяється торкатися. 143 00:07:01,540 --> 00:07:03,820 Ми якось дістатися поза межами 144 00:07:03,820 --> 00:07:05,995 що програма, тим компілятор, дав нам. 145 00:07:05,995 --> 00:07:08,310 І так вже, що це ключ до тримати в панелі інструментів 146 00:07:08,310 --> 00:07:10,660 ми починаємо процес налагодження. 147 00:07:10,660 --> 00:07:13,620 Щось пішло трохи неправильно тут. 148 00:07:13,620 --> 00:07:15,935 >> Гаразд, так що давайте почнемо до середи GDB 149 00:07:15,935 --> 00:07:19,030 і подивитися, якщо ми можемо з'ясувати, що саме проблема. 150 00:07:19,030 --> 00:07:21,674 Я збираюся очистити екран, і я збираюся ввести GDB 151 00:07:21,674 --> 00:07:24,340 знову, аби ввійти в середовище GDB, і ім'я програми 152 00:07:24,340 --> 00:07:27,450 що я хочу, щоб налагодити, buggy1. 153 00:07:27,450 --> 00:07:30,182 Ми отримуємо невелике повідомлення, читаючи , Зроблено символи з buggy1. 154 00:07:30,182 --> 00:07:32,390 Все це означає, що він витягнув це разом весь код, 155 00:07:32,390 --> 00:07:35,570 і тепер він був завантажений в GDB, і він готовий до роботи. 156 00:07:35,570 --> 00:07:37,140 >> Тепер, що я хочу зробити? 157 00:07:37,140 --> 00:07:39,130 Пам'ятаєш вам, що Перший крок, як правило, є 158 00:07:39,130 --> 00:07:42,540 після я всередині цього середовища? 159 00:07:42,540 --> 00:07:44,540 Сподіваюся, ви сказали, встановити точка розриву, бо 160 00:07:44,540 --> 00:07:46,240 в тому, що те, що я хочу зробити. 161 00:07:46,240 --> 00:07:47,990 Тепер, я не мають Вихідний код для цього 162 00:07:47,990 --> 00:07:50,948 переді мною, що, ймовірно, нетиповий випадок використання, до речі. 163 00:07:50,948 --> 00:07:52,055 Ви, напевно, буде. 164 00:07:52,055 --> 00:07:52,680 Так що це добре. 165 00:07:52,680 --> 00:07:55,790 Але якщо ви цього не зробите, те, що одна функція, що ви знаєте 166 00:07:55,790 --> 00:07:58,880 існує в кожній окремій програмі C? 167 00:07:58,880 --> 00:08:04,420 Незалежно від того, наскільки велика або наскільки складним це, безумовно, ця функція існує. 168 00:08:04,420 --> 00:08:05,440 Головна, вірно? 169 00:08:05,440 --> 00:08:08,870 >> Так невдачу за все, ми можемо встановити точку зупину на головній. 170 00:08:08,870 --> 00:08:12,200 І знову, я б просто надрукувати розмови Загальна, замість б. 171 00:08:12,200 --> 00:08:14,650 А якщо вам цікаво, якщо ви або введіть довгу команду 172 00:08:14,650 --> 00:08:16,800 а потім усвідомити, що вас набрали неправильну річ, 173 00:08:16,800 --> 00:08:18,770 і ви хочете, щоб позбутися все, як я тільки що зробив, 174 00:08:18,770 --> 00:08:22,029 Ви можете прийняти управління U, який буде видалити всі і повернутися назад 175 00:08:22,029 --> 00:08:23,570 на початку лінії курсора. 176 00:08:23,570 --> 00:08:26,569 Набагато швидше, ніж просто тримати вниз видаляти або наїзд купу разів 177 00:08:26,569 --> 00:08:27,080 більше. 178 00:08:27,080 --> 00:08:28,740 >> Таким чином, ми встановили точку зупину на головній. 179 00:08:28,740 --> 00:08:32,970 І, як ви можете бачити, це говорить, що ми маю встановити точку зупину на файл buggy1.c, 180 00:08:32,970 --> 00:08:36,330 і, мабуть, перша лінія з коду головне, лінія сім. 181 00:08:36,330 --> 00:08:38,080 Знову ж таки, ми не повинні вихідний файл тут, 182 00:08:38,080 --> 00:08:40,429 але я буду вважати, що це каже мені правду. 183 00:08:40,429 --> 00:08:44,510 І потім, я просто намагаюся і запустити програму, м 184 00:08:44,510 --> 00:08:45,360 Починаючи програму. 185 00:08:45,360 --> 00:08:48,160 Гаразд, так що це повідомлення трохи загадковими. 186 00:08:48,160 --> 00:08:50,160 Але в основному те, що що тут відбувається, це просто 187 00:08:50,160 --> 00:08:53,350 говорить мені, що я вдарив перерву Точка, точка розриву номер 1. 188 00:08:53,350 --> 00:08:55,877 >> А потім, що рядок коду, немає такого файлу або каталогу. 189 00:08:55,877 --> 00:08:57,710 Єдина причина, що Я бачу, що повідомлення 190 00:08:57,710 --> 00:09:00,800 тому, що я мимоволі видалений buggy.c файл. 191 00:09:00,800 --> 00:09:04,050 Якщо мій buggy1.c файл існує в поточному каталозі, 192 00:09:04,050 --> 00:09:06,920 що лінія тут фактично скажи мені, що рядок коду 193 00:09:06,920 --> 00:09:08,214 буквально читає. 194 00:09:08,214 --> 00:09:09,380 На жаль, я видалив його. 195 00:09:09,380 --> 00:09:14,790 Ми збираємося мати, щоб переміщатися вид через це трохи більше наосліп. 196 00:09:14,790 --> 00:09:17,330 >> Отже, давайте подивимося, що я хочу зробити тут? 197 00:09:17,330 --> 00:09:21,770 Ну, я хотів би знати, що місцевий змінні, може бути, доступних мені. 198 00:09:21,770 --> 00:09:23,570 Я почав мою програму. 199 00:09:23,570 --> 00:09:28,515 Давайте подивимося, що може бути вже инициализирован для нас. 200 00:09:28,515 --> 00:09:31,430 Я друкую інформація місцевих жителів, ні місцевих жителів. 201 00:09:31,430 --> 00:09:33,960 Гаразд, так що не дати мені тонни інформації. 202 00:09:33,960 --> 00:09:37,600 Я міг би спробувати і роздрукувати змінну, але я не знаю, які імена змінних. 203 00:09:37,600 --> 00:09:39,930 Я міг би спробувати назад слід, але я всередині основної, 204 00:09:39,930 --> 00:09:43,710 так що я знаю, що не зробив інший виклик прямо зараз функція. 205 00:09:43,710 --> 00:09:47,710 >> Так виглядає тільки мої варіанти використовувати п або так і почати занурюватися в. 206 00:09:47,710 --> 00:09:49,630 Я збираюся використовувати п. 207 00:09:49,630 --> 00:09:51,180 Так що я типу N. 208 00:09:51,180 --> 00:09:53,060 О, чорт візьми, що тут відбувається. 209 00:09:53,060 --> 00:09:56,260 Програма отримала сигнали, SIGSEGV сегментація вина, 210 00:09:56,260 --> 00:09:57,880 а потім ціла купа речей. 211 00:09:57,880 --> 00:09:58,880 Я вже перевантажені. 212 00:09:58,880 --> 00:10:00,980 Ну, насправді можна багато чому навчитися тут. 213 00:10:00,980 --> 00:10:02,520 Отже, що ж це нам говорить? 214 00:10:02,520 --> 00:10:09,180 Що це говорить нам про те, ця програма про, але має ще немає, SEG вина. 215 00:10:09,180 --> 00:10:12,550 І зокрема, я збираюся для збільшення ще далі тут, 216 00:10:12,550 --> 00:10:18,980 це збирається SEG несправність про те, що називається зЬгстр. 217 00:10:18,980 --> 00:10:22,705 >> Тепер, ми не можемо обговорили Ця функція широко. 218 00:10:22,705 --> 00:10:25,580 Але це тому, що is-- ми не збираємося говорити про те, що всі функції 219 00:10:25,580 --> 00:10:28,610 існує в стандарті C library-- але всі вони доступні для вас, 220 00:10:28,610 --> 00:10:32,110 особливо, якщо ви берете подивитися на reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 І зЬгстр це дійсно потужний функція, яка існує всередині 222 00:10:35,000 --> 00:10:38,070 в заголовку string.h Файл, який являє собою заголовок 223 00:10:38,070 --> 00:10:41,970 файл, який присвячений функцій що робота з і маніпулювати рядків. 224 00:10:41,970 --> 00:10:49,830 >> І, зокрема, те, що робить зЬгстр він порівнює значення двох рядків. 225 00:10:49,830 --> 00:10:54,160 Так і я про сегментацію провину на заклик STRCMP здається. 226 00:10:54,160 --> 00:10:58,530 Я вдарив п, а насправді я отримую повідомлення, Програма завершується з сигналом SIGSEGV 227 00:10:58,530 --> 00:11:01,370 Сегментація вина. Так що тепер Я насправді SEG порушеними, 228 00:11:01,370 --> 00:11:06,479 і моя програма має досить багато ефективно відмовили. 229 00:11:06,479 --> 00:11:07,770 Це кінець програми. 230 00:11:07,770 --> 00:11:10,370 Це зламався, він розбився. 231 00:11:10,370 --> 00:11:14,740 Так що не було багато, але я насправді дізнатися зовсім небагато 232 00:11:14,740 --> 00:11:16,747 з цього мало досвіду. 233 00:11:16,747 --> 00:11:17,580 Що я дізнався? 234 00:11:17,580 --> 00:11:22,020 Ну, моя програма падає в значній мірі негайно. 235 00:11:22,020 --> 00:11:26,300 Моя програма не працює на зателефонуйте щоб STRCMP, але я 236 00:11:26,300 --> 00:11:30,560 не мають жодних локальних змінних в моєму Програма в той час, він падає. 237 00:11:30,560 --> 00:11:37,320 Так що рядок або рядки, я міг би порівнюючи. 238 00:11:37,320 --> 00:11:42,140 Якщо я не будь-яка локальна змінні, ви можете 239 00:11:42,140 --> 00:11:45,520 припустити, що я, можливо, have-- Тобто це глобальна змінна, яка може бути правдою. 240 00:11:45,520 --> 00:11:47,670 >> Але в цілому, здається, як я порівнюю 241 00:11:47,670 --> 00:11:52,070 до чогось, що не існує. 242 00:11:52,070 --> 00:11:54,130 Так що давайте досліджувати що трохи далі. 243 00:11:54,130 --> 00:11:55,120 Так що я збираюся очистити екран. 244 00:11:55,120 --> 00:11:57,536 Я збираюся кинути з ряду GDB середу на секунду. 245 00:11:57,536 --> 00:12:01,300 І я думав, добре, так що немає локальні змінні в моїй програмі. 246 00:12:01,300 --> 00:12:06,444 Цікаво, якщо можливо, я повинен пройти в рядку в якості аргументу командного рядка. 247 00:12:06,444 --> 00:12:07,610 Так що давайте просто перевірити це. 248 00:12:07,610 --> 00:12:09,020 Я не зробив цього раніше. 249 00:12:09,020 --> 00:12:14,244 >> Давайте подивимося, якщо можливо, якщо я запускаю цю програму з аргументом командного рядка працює. 250 00:12:14,244 --> 00:12:16,140 Так, ні помилки сегментації там. 251 00:12:16,140 --> 00:12:17,870 Це просто сказав мені, що я зрозумів це. 252 00:12:17,870 --> 00:12:19,170 Так, може бути, це виправлення тут. 253 00:12:19,170 --> 00:12:27,560 І справді, якщо я йду назад і подивитися на фактичний вихідний код для buggy1.c, 254 00:12:27,560 --> 00:12:31,180 здається, ніби те, що я роблю, Я роблю виклик STRCMP без 255 00:12:31,180 --> 00:12:34,010 перевірки, чи є ARGV [1] існує насправді. 256 00:12:34,010 --> 00:12:36,730 Це насправді Вихідний код для buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Так що я дійсно потрібно зробити тут, щоб виправити мою програму, 258 00:12:38,855 --> 00:12:40,835 припускаючи, у мене є подати переді мною, є 259 00:12:40,835 --> 00:12:44,740 просто додати перевірку, щоб впевнений, що ARGC одно 2. 260 00:12:44,740 --> 00:12:47,780 Так що це приклад, знову ж, як я вже сказав, трохи надуманий, вірно? 261 00:12:47,780 --> 00:12:49,840 Ви зазвичай не збирається випадково видалити вихідний код 262 00:12:49,840 --> 00:12:51,820 а потім спробувати і налагодити програму. 263 00:12:51,820 --> 00:12:53,120 Але, сподіваюся, це дало Ви ілюстрацією 264 00:12:53,120 --> 00:12:55,120 з тих речей, що Ви могли б думати про 265 00:12:55,120 --> 00:12:56,610 а ви налагодження програми. 266 00:12:56,610 --> 00:12:58,760 >> Що стан справ тут? 267 00:12:58,760 --> 00:13:00,510 Які змінні чи я є доступним для мене? 268 00:13:00,510 --> 00:13:03,600 Де саме моя програма гуркіт, на якій лінії, 269 00:13:03,600 --> 00:13:05,240 на те, що заклик до якої функції? 270 00:13:05,240 --> 00:13:06,952 Які докази дає це мені? 271 00:13:06,952 --> 00:13:08,910 І це саме вид мислення, що вам 272 00:13:08,910 --> 00:13:12,820 повинні отримувати в коли ви думати про налагодження програм. 273 00:13:12,820 --> 00:13:13,820 >> Я Дуг Ллойд. 274 00:13:13,820 --> 00:13:16,140 Це CS50. 275 00:13:16,140 --> 00:15:08,642