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 Ако не използвате графичния дебъгер, който колегата Dan 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 да използвате графичния дебъгер която е вградена в логическо устройство. 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 е, когато сте написали неща при LS командните line--, 33 00:01:35,841 --> 00:01:38,115 cd-- всичките си типичен Linux команди, бързата си 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 >> Първият е, Ь, които е кратък за почивка. 39 00:01:55,200 --> 00:01:58,690 И след като сте написали Ь, вие обикновено въведете името на функция, 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 Или ако вече използвате, можете да използвате и да се изправим един ред код. 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 можете да въведете р или Print, и след това името на променливата. 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 Следващата е БТ, което е Накратко Обратно Trace. 95 00:04:37,770 --> 00:04:41,680 Сега, обикновено, особено в началото CS50, 96 00:04:41,680 --> 00:04:44,450 вие няма да имате повод наистина да се използва БТ, или Back Trace, 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-- можете да напишете БТ, или обратно проследяване, 111 00:05:27,210 --> 00:05:32,370 и тя ще разпечатате ч, д, е основна, заедно с друга информация, която 112 00:05:32,370 --> 00:05:35,984 дава представа, че основната OK наречен 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 Main, нали? 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 можете да вземете Control 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 Така че аз написали п. 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 Какво ни казва е, тази програма е път да, но има все още, сегменти вина. 215 00:10:09,180 --> 00:10:12,550 И по-специално, аз отивам за да я увеличите още повече тук, 216 00:10:12,550 --> 00:10:18,980 тя е на път да SEG вина за нещо, наречено strcmp. 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 И strcmp е наистина мощен функция, която съществува вътре 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 >> И по-специално, това, което прави, е strcmp той сравнява стойностите на две струни. 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 сегментацията на вина. Така че сега Аз всъщност са сегменти обвиняван, 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 И аз съм мисля, OK, така че има няма местни променливи в моята програма. 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