[? Дан АРМАДАРАС:] Здраво, Ја сам [? Ден Армадарас?]. Данас, ћемо се гледа отклањање грешака. Не само да ћемо причати о неким техникама, али ћемо да погледамо неке особине садржи у ЦС50 ИДЕ које дозвољавају да лако дебуг програм. Само један од примера нешто што може да пође наопако и то је заправо нешто да смо већ видели раније. У овом случају, ово је Ц програм који прихвата цео број од корисника, дели га са два, а пружа излаз назад на корисник. Сада од онога што смо видели раније на предавањима, знамо да ће то заиста изазвати специфичне врсте проблема поделе када имамо непарне бројеве. Наиме, само ћемо бацити нешто после децималног зареза. Дакле, ми знамо да је ово деси да буде случај. И ако га покренути, можемо потврдити наше сумње, први, по прикупљању. И онда, трчање и уласка непаран број. Ово није ништа ново. Али то је заправо пример бубу може постојати у оквиру ширег програма која постаје теже пратити. Иако знамо шта је проблем је, прави суштина ствари можда покушава да идентификује посебно где се грешка идентификовање шта тај проблем је, а затим га поправи. Дакле, дају ово као пример шта би могло бити нешто да већ знамо, али могу бити сахрањен у другим елементима кода. Тако отварања овог други извор Код слику као пример, Овај проблем подела је сада део ширег програма. Ипак можда мало мало измишљен, а ми Можда ћете моћи лако идентификују се, нарочито јер ми само говоримо ово. Али можемо схватити да је ово Проблем може постојати у већем обиму. Ако саставити ово и сад покрените га, унесите непаран број, можемо видети да не будемо тачно излаз да смо можда очекивали. У овом конкретном случају, можемо рећи да смо Желим да рачунају све бројеве од једног до неке специфичне број. И можемо да видимо да имају различите питања овде ако смо излаза, једноставно, 0 и 1 када се дају допринос од 5. Дакле, ми већ знамо да нема ту проблема. Али не могу да знам тачно где се то питање заиста постоји. Сада је један од начина да можемо покушати да поправи ово је нешто што имамо већ уведен у. Можемо га користити у већем обиму. Он лине 14, имамо ово Функција принтф, што нам омогућава да одштампате државе различитих делова информација. И то је нешто што вас треба искористити у оквиру вашег програма покушати да схватим шта је дешавало у разним линија кода. Дакле, чак и ако то није крајњи резултат да смо заправо Желим да се произведе од овај програм, још увек можда има неку дебуг изјаве где смо можете покушати да схватимо шта тачно се дешава унутар нашег кода. Дакле, у овом случају, ја ћу принтф са дебуг таг. У овом случају, ово је Само дебуг низ да сам горе-стављајући тако да постаје врло јасан у излазу мог кода шта је то што желим да покажем. А излаз овде број да смо израчунати. У том случају, могао бих Желим да знам прецизно шта се дешава пре и после неког конкретног рачунања. Тако да сам могао користити принтф пре а након тога линију кода. У овом случају, чак сам могао чине га мало јасније рекавши дебуг пре и исправљање после толико да не се помешати са више линије које изгледају идентично. Сада, ако смо рекомпајлирајте ово анд Рун да, унесите број као пет опет, видимо да имамо одмах излаз пре и после и сматрају да нисмо урадили јасна подела или јасно имају броја да ми заправо желимо да урадимо. Сада у овом случају, ово је Није баш јасно излаз. Није баш јасно да исход желимо из овог одређеног програма. И ово је, опет, мало измишљен. Али, можда, једна од ствари које можемо да урадимо ако спецификација рекао да желимо да поделимо овај од 2 и додати 1-- тако Другим речима, желимо да заокружите их-- онда могли бисмо знали да смо могли Урадите то одређену ствар, у овом случају. Сада овде знамо да ћемо бити у стању да додаје 1 наше преполовљен број. Хајде да ово рецомпиле и потврдите да је ово понаша на начин на који желимо да. Видимо да је сада пред који има, имамо број 5. Након имамо број 3, који је према нашим спецификацији, је оно што смо желели да урадимо. Али ако погледамо излаз овде, можемо видим да бисмо могли имати још један буг свеукупно, што је да почињемо нашу бројање од 0. Сада опет, ово је нешто које смо видели у прошлости и можемо поправити прилично лако. Али у овом случају, Такође је имао предност коришћења изјаву принтф директно унутар фор петље да зна тачно где та грешка се дешавало. Тако принтф изјаве врло корисни помазуци да одредите где, управо у изворни код, специфична грешка се дешава. И то је такође важно да схватимо да, као што смо писање кода, можда имамо претпоставке о стању програма. Или можда имамо претпоставке о томе шта део програма је заправо тачно или нетачно када касније као градимо на том програму и чине га дио једне сложен и већи програма да схватимо да неки аспект то је заправо луд. Користећи принтф може заиста помоћи сузити и идентификују региони програма који не може се тачно понаша на начин на који смо Очекујемо, на основу наших претпоставки. Али има и друге алате доступно, такође, да нам омогућити да покуша да слици где грешка се дешава Исто тако, конкретно, како ствари се дешавају унутар програма. Дакле, користећи иф веома корисно када желимо да идентификују специфичне области програм који имају неку грешку. Али такође постаје досадан након неког времена. У овом случају, ово је релативно једноставан програм са само једном или две променљиве. И то постаје врло лако за нас да одштампате вредност тих променљивих у контексту већег програма. Али можда има другачији Програм који има много варијабли. И то не може бити сасвим тако једноставан за коришћење принтф да покуша да процени шта се дешава за сваку од тих променљивих један док се програм извршава. Постоји програм који постоји назива отладчик програма. У овом случају, онај који ћемо Употреба је ГНУ Дебуггер, или ГДБ, који нам омогућава да прегледа унутрашњи деловање програма у много детаљан начин. Можемо да заправо извршава ГДБ из командне линије Овде једноставним куцањем ГДБ и команда која желимо да дебуг. У овом случају, рачунају. Сада у овом случају, можемо видети да је доводи нас у линији на којој пише ГДБ. И заиста можемо извршава команде ГДБ да стварно почне Извршење Програм, престани одређене тачке, проценити променљиве и прегледати променљиве које постоје у програму државе у том тренутку, и тако даље и тако даље. Она пружа много енергије за нас. Али то је само тако се дешава да ЦС50 ИДЕ такође даје ГУИ или корисника интерфејс за ГДБ који омогућава нам да то урадите без потребе интерфејс командне линије уопште или уопште чак. Начин на који могу приступити да је помоћу дугмета дебуг на самом врху ЦС50 ИДЕ. Сада у прошлости, оно што имамо види се да користите команду линија за састављање и покрените програм. Дугме дебуг ради оба од ових корака. Али такође ће подигни дебагер језичак на крајњој десној страни који нам омогућава да прегледају различите особина програма како је извршава. Ако кликнете дебуг, у овом случај, то ће довести до нова картица у конзоли прозор на самом дну. И можете да видите да је ово картица има неке информације на самом врху. И ми у великој мери можемо да игноришемо ово. Али једна од ствари да желимо да приметите је да даје иста ствар коју смо би добили ако бисмо покушали да тече направи на Ц програм у терминалу. Овде можемо видети да је покренут Цланг, и има разне заставе, и то је састављање наше цоунт.ц фајл, што је био изабрана картица у то време да сам погодио дебуг. Дакле, ово је веома користан јер сада користи ово дугме дебуг, можемо истовремено може саставити и онда изврши програм који смо заправо желите да покренете. Једну од застава то јест важно, у овом случају, Ми смо заправо смо користили најдуже али само сам мало руку машући [неразумљиво], која је овај овде. У кланг, пише -ггдб3. У овом случају, оно што смо говори кланг, наш преводилац, је да желимо да састави наш програм. Али такође пружају оно што су назива информације симбол тако да је преводилац заправо има приступ да много основне информације садржан у оквиру програма. Конкретније, број функција које имам, имена тих функција, променљиве, типови да су те варијабле су и разноврсне других ствари које помажу у дебуггер обавља своју делатност. Сада има још нешто То је важно напоменути када говоримо о руннинг програм на овај начин. Приметите да заправо има одрастао нову картицу у нашој конзоли дуж дну. Ми више не морају да комуницирају директно са прозор терминала. Али ово је нова картица заправо прозор терминала. Само је специфичан за трчање програм који смо створили. Приметите да на дну, у комбинација са неким излазом од цланг преводилац и ГДБ, који смо у великој мери могу да игноришу, заправо показује излаз наш програм на самом дну. Сада је важно схватити да је ово један прозор у ствари ће вам показати излаз из вашег програма али такође може да прихвати унос за тај програм, такође. Тако обавештење да каже унесите број, што је исто излаз који смо имали имали у терминал прозору раније. Али то је сада приказано на овој новој картици. Могу улаз број. И то је заправо хоће функционишу као очекујемо показујући нам нашу дебуг оутпут, излаз који може бити луд, као што смо раније видели. И на самом дну, то заправо има неке додатне излаз од БДП-а само кажем да овај програм је завршен. Сада као што сте видели у овом Посебно пролазе кроз, није био посебно корисно јер чак и иако смо имали доћи дебагер мени горе, ово је још увек трчање програма. Ни у једном тренутку то урадио ствари паусе извршење за нас бити у стању да прегледа све променљиве садржане у. Има још нешто да морамо да урадимо како да ГДБ да признају да желимо за паузирање извршење програма и не само дозволити да настави нормално као што би у сваком другом случају. Да би то паусе извршење, у одређеној линији, морамо да створимо што је назива бреак поинт. И прекид тачка веома лако направљена У овом ЦС50 ИДЕ узимајући миша и кликом директно на лево неке специфични број линије. Када сам то урадио, црвена тачка Изгледа, што указује да је линија је сада пауза тачка. И следећи пут када сам покренути ГДБ га, ће се зауставити извршење у те прекретнице када достигне ту линију кода. Ово је важан ствар да схвате да то није нужно Случај да свака линија кода је заправо доступна. Ако бих да се створи функцију овде, за екампле-- воид ф-- и само уради за штампање линију овде-- здраво ворлд-- ако никада назвати ову функцију, то ће бити случај да, ако подесите брејк овде, функција никада неће бити позван. И зато, овај Посебно бреак поинт никада неће заиста паузирати извршење програма. Па рецимо да сам добро створити прекид тачка на некој линији кода који ће заправо бити погубљен. Сада, у овом случају, то је Први ред у основну функцију. Дакле, то ће сигурно бити случај да, чим почне извршење, сама прва линија ће бити постигнут. ГДБ ће паузирати извршење. А онда, ја ћу бити у стању да интеракцију са дебагером. Можете подесити више линије као Бреакпоинтс, ако желите. Такође, можете да креирате линију до овде у овом сегменту кода које никада неће бити постигнут. И можемо поставити један у даљем тексту. Разлог због којег бисмо желите да урадите ово ћемо иду у мало више детаљ за који тренутак. Дакле, за сада, дозволите ми да искључите ови додатни брејк тако да можемо да погледамо шта се дешава када имам једну паузу тачка у мом програму. Направио сам неке промене овог програма. Зато треба да га спаси. Ја ћу кликните дебуг тако да могу бегин компилацију, а онда извршење дебагером. Видећемо да, после тренутака, Линија која смо одабрали као паузе поента је истакнут жутом бојом. Такође можемо приметити да је у горњи десни у дебуг панелу да је икона пауза је укључен у малу икону игре. То значи да имамо паузу извршење, у овом конкретном случају. И ударање на дугме Плаи би нам омогућити да настави извршење у том одређене тачке. Обратите пажњу да постоји неколико других Тастери доступни у овом панелу, дебуг kao. Корак преко, који ми омогућава да изврши ту једну линију кода и корак преко те линије до следеци, која, у овом случају, би значило да је принтф Изјава се извршава. И то ће онда стани извршење он лине 13, овако. А ту је и корак у функцију, која је корисно ако сам створио други Функције другде у изворном коду. И желим да закорачите у те функције пре него изврши ту функцију у целини. Али ћемо погледати још у фази у функцију у само тренутак. Сада обратите пажњу на неке друге ствари које заиста постоје у овом дебуг панела. Имамо овај панел под називом Цалл Стацк, која нам показује Где смо ми. У овом случају, ми смо унутра главног функције. Наш скрипта се зове цоунт.ц. И ми се деси да буде на линија 13, колона, она која је управо оно што је истакао област изворног кода указује, као добро. Сада обратите пажњу да ово показује под локалном променљиве секције све варијабле које постоје у оквиру ове функције. Важно је напоменути да су сви варијабли ће се појавити у овој локалној променљивој секција у оквиру функције, чак и пре него што се дефинишу. Овде се види да имамо променљиву Број назвао, има неку вредност од 0, и то је типа инт. Пре него што заправо инитиализе свих ових варијабли, нисмо нужно гарантовано да види вредност 0. И у зависности од друга погубљења да сте извршили и стање вашег сећања када је ви заправо покренути овај програм, можда откријете да Не видим вредности 0 и, уместо тога, неке друге луде бројева. Али не брините о томе. Неће бити релевантни до заправо иницијализујете вредност. Сада у овом случају, можемо видети да Ја сам обављао неке резултате. И ја, управо сада, застао извршење. Али у овом случају, оно што Ја стварно желим да радим је сада корак преко ове линије кода тако да сам заправо могу упита корисника за тај инт који желимо да користимо у нашем програму. Сада у овом случају, када Ударио сам корак изнад, обавештење да Пауза или радије Настави тастер је промењен у овом дугме Паусе јер овај код заправо извршава. Šta se dešava сада је да је чека нас унос неке информације као што можемо видети наше излаза текст на самом дну. Тако сада, ово је заправо није застао, чак томе, јер на неки начин, појављује да је због ништа се не догађа. Али то је само тако се дешава да се у мој специфичан случај он лине 13, Чекам корисника унос. И тако ГДБ није у стању да прегледа програм као што је трчање. Сада следећи пут да унесете неки инпут-- тако да ћу ући тај број 5, као што смо видели у паст-- ударио Ретурн, а ми Приметићете да одмах, ГДБ паузе и, опет, истиче следећу линију. Али приметио да сада, као резултат нашег унос вредности, унапредили смо ту вредност у наших локалних променљивих, које је веома корисно знати прецизно шта је тај број био у меморији. Сада могу дозволити овај програм да настави играју до краја његовог извршења ударајући Настави. Можемо да видимо врло брзо Да ли програм финиш извршења са истог излаза који смо имали пре, за отклањање грешака затвара, а сада овај програм је потпуно обустављена. Ја показују да само за Сврха видим шта се дешава када смо заправо ударио Настави. Али ми заправо ћемо Желим да се вратим у овај програм тако да можемо да покушамо да дебуг управо оно што се дешава. Сада када сам користећи дебагер, могу Не треба те дебуг принтф изјаве. Тако сам могао да их уклоне јер ћу учинити сада само да се вратимо на нашу једноставнији код да смо имали пре неколико тренутака. Сада када сам спасити програмирање и извршавање га, то ће, опет, иде у том почетном брејк који сам имао на линији 11. А ја ћу бити у могућности да провери моје варијабле као што желим да радим. Десило се да је ово Део није веома интересантно, И знам да ћу да одштампате ову изјаву. Молимо вас да унесете број. А онда, знам да ћу да пита корисника за тај цео број. Па, можда, ја заправо желим да померим Поинт Бреак мало ниже. Можете уклонити брејк тако што ћете кликнути, опет, непосредно лево од тог броја линије. То црвена тачка ће нестати, што указује да је пауза тачка је нестао. Сада у овом случају, извршење је заустављена. И тако није заправо догађа на наставити у том конкретном случају. Али ја могу поставити паузу тачка а мало касније. И када сам сада наставити мој код, то ће се наставити и рећи поента те прекретнице. Опет, ја ударио Настави. Чини ми се да ништа се не догађа. Али то је зато што је мој Код чека за унос. Ја ћу ући у број 5, притисните Ентер, и Сада следећа пауза тачка ће бити хит. Сада у овом случају, то је линија кода да, пре него што смо знали Десило се да Бугги. Дакле, хајде да процени шта се дешава у овом тренутку. Када је линија је истакнуто, ово линија још увек није извршена. Дакле, у овом случају, можемо видети да имам неки број, који Имам цео под називом Број који има вредност 5. И ја ћу се обављање мало математике на том броју. Ако корак преко тога, можемо приметити да су вредности нум није променило у складу са аритметика да смо заправо урадили. И сада када смо унутар ове петље за или сада када је за петљу Сама је истакао, видимо да имамо нови променљива сам позвао да биће користити у да за петљу. Сада се сетим Пре тога сам напоменути да понекад си да видим неку луд бројеви као подразумевано пре тог броја или да променљива Заправо инитиализед. Можемо тачно видети да овде у овом променљиве Звао сам, која нема још није инитиализед у време истицања. Али можемо видјети да има неки број да не би заправо очекивали. To je ok. Не брини о томе јер имамо заправо није инитиализед тај број до И корак преко ове линије и вредности И је иницијализује на вредност 1. Дакле, да видим да је то у ствари случај, идемо корак готова. Сада се види да је линија је извршена. И сада истицање ово иф линија. А сада да видимо како наше вредности И и 3 су се променила током времена. Ово је веома корисно да се уради, у ствари, је на корак преко линије у више наврата. И можете наћи шта је заправо дешава унутар вашег петље за и каква је ситуација варијабле унутар тог фор петље као да се извршење програма јавља један корак по корак. Сада у овом тренутку, ја прешли довољно да сам сада на крају мог програма. Ако корак преко тога, он ће заправо престаје извршење као што смо видели у прошлости. Дозволите ми да поново ово, опет, тако да могу указати нешто друго од, kao. У овом случају, то је Сада ме питате, опет, за број, који Ја ћу, опет, ентер. Али овај пут ћу да уђу у већи број тако да је за петљу ће поновити више пута. У том случају, ја ћу да унесете вредности од 11. Сада поново јер бих сет прекид тачка на линији 15, то ће да истакне ту линију. Видимо да је наш број 11 је исправно заступљене у нашим локалним варијабли. Степпинг преко тога, можемо сада ватцх шта се дешава са нашим вредности И као што наставимо унутар ово петље. Обично се повећава сваки пут кад достигну врх који за петље. Сада једна од ствари која би могла било корисно да ураде током извршења овог програма је за мене да заиста промените варијабли средњи ток да видим шта се дешава са мојим програмом. У том случају, заправо могу двапут кликните на вредност. Обратите пажњу да постане текст поље. Сада могу ући другачији ценимо потпуно да видим како мој програм понаша када сам променио ту променљиву. Сада у овом случају, променљива И сада садржи вредност 10. Али програм је још увек застаде у извршењу. Када сам корак више, видим да је вредност Ја, који сам ушао као 10., није већа од вредности нум, која је одмах изазива фор петље да се заустави извршење. Сада то није једини Разлог зашто би Желим да измени променљиву у месту. Ти заправо можда ћете желети да покушамо да га модификује тако да можете наставити извршење петље или тако да можете изменити нека вредност пре тога достигне неки посебан скуп аритметике да сте о да изврши. Дакле, сада када смо у ствари промијенити вредност ја као програм је извршавање, то је изазвало фор петље да одустане прерано јер одједном, ја се случајно већа од вредности од цилиндра, што значи да је за петљу не треба да се изврши. Даље, то се десило да је случај који смо променили вредност од И када је истакнута линија 17, што је тачка у времену да је за извршење петље заправо се оцењује. Да сам променила вредност сам на другој линији, рецимо 19, ми би смо видели другачији Понашање јер линија 19 би су погубљени пре петље Услов је реевалуира. Сада у овом тренутку, ја сам, опет, на крају овог програма. И могу дозволити да се то настави на дозволите ми програм за природно отказ. Али постоји неколико ствари који су важни за понети из овог конкретног разговора. Морате да се процени твоји претпоставке о томе како код треба да се понаша. Сваки пут када мислите да неки комад о код знате деси да радите, можда је црвена застава да иде назад и проценити, и будите сигурни да ваше претпоставком како то функционише код је заправо истина да како је изражена у вашем изворном коду. Али, чак и више тачке био, када се користи за отклањање грешака, можете ставити на бреакпоинт различитих линија кода, што ће проузроковати дебуггер до паусе извршење на сваком од тих линија тако да можете оцијенили меморија или чак га променити у месту. И опет, сетите се да можете креирати више бреакпоинт тако да може да настави извршење, скип над великим деловима кода, и аутоматски ће паузирати током следеће паузе тачку. Заправо напреднији Нема карактеристике дебагера, као добро. Али мораћемо да вас упутим неким каснијим видео како би се заиста измамио осим како да користе те посебне функције. За сада, хвала много за гледање. И срећно отклањање грешака.