Даг Ллоид: У реду ГДБ. Шта је то тачно? Тако ГДБ, који стоји за ГНУ Дебуггер, је стварно одличан алат који можемо користити да нам помогну дебуг наше програме, или сазнају где су ствари иде наопако у нашим програмима. ГДБ је невероватно моћан, али излаз и интеракција са њом може бити мало загонетан. Обично је командна линија алат и може да баци много порука на тебе. И то може некако тешко парсе тачно шта се дешава. Срећом, ми смо предузели кораке да поправим овај проблем за вас као што раде кроз ЦС50. Ако не користите графичком отклањање грешака, што је мој колега Ден Армандарсе је прилично говори мало о у видеу који би требало да буде овде сада, можда ће бити потребно да користе ове командну линију алати за рад са ГДБ. Ако радите у ЦС50 ИДЕ не морате да урадите. Али ако ниси ради у ЦС50 ИДЕ, можда користећи верзију од ЦС50 Апплианце, или неки други Линук оперативни систем са ГДБ инсталиран на њему, можда ћете морати да користите ови командне линије алата. А пошто сте можда мораш то да радиш, то је корисно само да разуме како ГДБ ради из командне линије. Али опет, ако сте коришћењем ЦС50 ИДЕ, ви могу користити графички дебуггер која је уграђена у ИДЕ. Тако да се иде код ГДБ, за почетак дебуггинг Процес одређена Програм, све што треба да урадите је тип ГДБ следи по имену програма. Тако, на пример, ако је ваш програм здраво, ти би типа ГДБ хелло. Када то урадите, идеш да повуците ГДБ животне средине. Ваше брзу ће се променити, и уместо да га обично оно када куцате ствари На командној лине-- лс, цд-- све ваш типичан Линук команде, своју линију ће променити, вероватно, нешто као загради ГДБ заградама. То је твоја нова ГДБ брз, јер ви сте унутар ГДБ окружењу. Једном унутар тог окружења, постоје две главне команде да ћете вероватно користити у следећем редоследу. Прво је б, којем је скраћеница за паузу. И након што сте тип Б, обично упишите назив функције, или ако се деси да знате око онога што линија број ваш програм почиње да се понаша мало чудно, можете уписати линију Број тамо. Какав Б, или пауза, ради да ли је ваш програм омогућава да ради до одређене тачке, Наиме, назив функције да одредите или линија број који сте навели. И у том тренутку је, ће замрзнути извршење. Ово је стварно добра ствар, јер Једном извршење је замрзнут, можете почети да јако споро корак кроз програм. Обично, ако сте били руннинг ваши програми, они су прилично кратко. Обично, куцате дот сласх год име вашег програма, притисните Ентер, и пре него што можете да трепне, твој Програм је већ завршен. Није баш пуно времена да покуша и схватити шта није у реду. Тако да заиста бити у стању да успори ствари доле постављањем брејк са б, а затим степпинг у. Онда кад сте подесили бреак тачка, можете покренути програм. А ако имате било командне линије аргументи, да их наведете овде, а не када куцате ГДБ ваше име програма. Ви одређујете све командну линију Аргументи за узимање Р или трчи, и онда шта год аргументе командне линије Потребан вам је унутар вашег програма. Постоји велики број других стварно важне и корисне команде унутар животне средине БДП. Зато ме пусти само брзо прођем кроз неке од њих. Први је н, што је скраћеница за следећи, а можете уписати следећа уместо н, како ће радити. И то је само кратко. И као што вероватно сте већ стечен некада, бити у стању да куцате ствари краћи је генерално боље. И шта ће учинити да је ће корак напред један блок кода. Тако да ћу кренути напред док се позив функције. А онда уместо роњење у те функције и пролази кроз све то функција код, он ће морати функцију. Функција ће се звати. То ће учинити без обзира на његов рад. То ће вратити вредност функција која га је назвао. А онда ћете прећи на Следећа линија тог позивање функције. Ако желите да корак унутар функције, уместо да има да изврши, посебно ако мислите да је проблем Можда леже унутар те функције, можете, наравно, поставити паузу указују унутар те функције. Или ако сте већ покренут, можете Употребите с да корак напред једну линију кода. Тако ће овај корак у и роњење у функцијама, уместо да само имају извршава и наставак дешава у функцији да си у за отклањање грешака. Ако сте икада желите да знате вредност променљиве, можете уписати П или Принт, а затим назив променљиве. И то ће одштампати за вас, унутар ГДБ животне средине, име променљиве, које ти- извините ме-- вредност променљиве да сте по имену. Ако желите да знате вредности сваког Локална променљива приступити одакле тренутно се налазе у вашој Програм, можете уписати инфо локално становништво. То је много брже од куцањем п и онда шта год, листинг од свега од варијабле које знате постоје. Можете инфромација локално становништво, и то ће одштампати све за тебе. Следећи је БТ, који је кратак за Бацк Траце. Дакле, генерално, посебно у раним ЦС50, нећете баш имати прилике користити БТ, или натраг Траце, зато што не водимо функције да зовем друге функције. Ви можда има главну разговора а функција, али то је вероватно то. Немаш ту другу функцију позива другу функцију која позива друге функције, и тако даље. Али, као што ваши програми се више комплекс, а посебно Када почнете са радом са рекурзије, врати траг може бити јако користан начин да вас пусти врста мало контекст где Ја сам у свом програму. Тако да сте написали свој код, и знате да је главни позива функцију Ф, која позива функцију г, који позива функцију х. Дакле, имамо неколико слојева за настанак дешава овде. Ако сте унутар Ваш ГДБ окружење, а ви знате свој унутрашњи Х, али заборављаш шта те одакле си су-- можете уписати БТ, или назад траг, и то ће одштампати х, Г, Ф главни, уз неке друге информације, које даје појма да је, у реду главна назива Ф, Ф се зове г, Г позвао х и ту сам Тренутно сам у свом програму. Дакле, то може бити веома користан, посебно као криптичној-несс оф ГДБ постаје мало неодољив, да сазнати тачно где ствари. Коначно, када је ваш програм ради, или када завршите га отклањање грешака и желите да удаљите од ГДБ животне средине, то помаже да знају како да изађу из ње. Можете тип к, или Прекини, да изађе. Сада, пре данашњег видео Ја сам припремила бугги програм зове бугги1, који сам саставио из датотеке познат као бугги1.ц. Као што се може очекивати, ово Програм је у ствари бугги. Нешто крене наопако када покушам и покрените га. Сада, нажалост, ненамерно избрисан мој бугги1.ц фајл, тако да би за мене да схватим шта није у реду са овим програмом, Ја ћу морати да користе ГДБ врста слепо, покушавајући да се крећете кроз овај програм до схватим шта није у реду. Али користећи само алатке смо већ научили о, можемо прилично много фигуре се тачно шта је то. Дакле, кренимо преко до ЦС50 ИДЕ и да погледам. У реду, тако да смо овде у мом ЦС50 ИДЕ окружење, и ја ћу увећали мало тако да можете видети мало више. У мом прозору терминала, ако листу садржај мог тренутног директора са лс, видећемо да сам има неколико изворних датотека Овде, укључујући претходно разговарали бугги1. Шта се тачно дешава када Трудим се и покрените бугги1. Па хајде да сазнамо. Куцам дот сласх, Бугги, а ја притисните Ентер. Сегментације грешке. То није добро. Ако се сећате, А Сегментатион фаулт типично настаје када се приступи меморији да не сме да дира. Некако смо стигли изван граница шта програма, преводилац, нам је дао. И тако већ да је траг да задржи у кутији за алат као што смо започели процес отклањање грешака. Нешто је отишао мало овде није у реду. У реду, Почнимо до тхе ГДБ животне средине и видимо да ли можемо схватити шта је проблем. Идем разбистрити екран, и ја ћу да куцате ГДБ Опет, да уђе у ГДБ животне средине, и назив програма да желим да дебуг, бугги1. Ми смо добили малу поруку, читање симболи из бугги1, урађено. Све то значи да је извукао сви заједно кода, а сада је био напуњен у ГДБ, и то је спреман да иде. Оно што желим да урадим? Да ли се сећате шта је Први корак је типично након што сам унутар ове средине? Надам се, рекао си сет бреак ствар, јер У ствари то је оно што желим да урадим. Сада, ја немам изворни код за ово испред мене, што је вероватно није типичан случај употребе, успут. Вероватно хоће. Дакле, то је добро. Али под претпоставком да не, шта је онај функција да знате постоји у свакој Ц програма? Без обзира колико велики или колико је компликовано је, ова функција дефинитивно постоји. Главни, зар не? Дакле, што није ништа друго, можемо поставите брејк на главни. И опет, само да откуцате бреак главни, уместо б. А ако сте радознали, ако вас икада откуцати дуг команду и онда схватите да сте куцао погрешну ствар, и желите да се отарасим од свега што сам управо урадио, можете преузети контролу У, који ће избрисати све и вратити вас до почетка курсор линија. Много брже него само држите брисање или је забио гомилу пута готова. Тако ћемо поставити брејк на главни. И као што видите, пише имамо постави брејк на фајл бугги1.ц, и по свему судећи прва линија кода магистралног је линија седам. Опет, ми немамо извор фајл овде, али ћу претпоставити да је ми кажеш истину. А онда, само покушавам и покрените програм, р. Покретање програма. У реду, тако да ова порука је мало загонетан. Али, у суштини оно што је дешава овде је да је само говори ми да сам ударио паузу тачка, бреак поинт број 1. А онда, та линија кода, Нема такве датотеке или директоријума. Једини разлог због којег Видим ту поруку је зато што сам случајно избрисан мој бугги.ц фајл. Ако мој бугги1.ц фајл постојао у текућем директоријуму, та линија право заиста постоји би реци ми шта је линија кода дословно гласи. Нажалост, то брише сам. Ми ћемо морати да некако навигацију кроз ово мало више слепо. У реду, да видимо, шта Не желим да радим овде? Па, ја бих волео да знам шта локална променљиве можда су доступни за мене. Ја сам почео мој програм. Хајде да видимо шта би могло бити Већ инитиализед за нас. Ја инфромација просторије, нема локално становништво. У реду, тако да не дај ми тону информација. Могао бих да покушам и одштампати променљиву, али ја не знам ни имена променљивих. Могао бих да покушам споредни траг, али сам унутар главни, тако да знам да нисам направио Друга функција одмах позива. Дакле, изгледа да моје једине опције су користити н или тако и почети да зароните. Ја ћу користити н. Тако сам тип бр. О боже, шта се овде дешава. Програм је сигнале, СИГСЕГВ Сегментатион фаулт, а затим гомила ствари. Већ сам преплављен. Па, у ствари постоји доста тога да се овде научили. Дакле, шта нам ово говори? Оно што нам говори је, овај програм је о да, али још увек није, сец кривица. И посебно, идем да зумирају још даље овде, то је управо СЕГ грешку о нешто што се зове стрцмп. Сада, можда нисмо разговарали ова функција нашироко. Али то је- зато што нећемо да разговара о сваком функцију која постоји у Ц Стандард либрари-- али су сви вам на располагању, посебно ако узмете погледај референце.цс50.нет. И стрцмп је стварно моћан функција која постоји унутар од стринг.х заглавља филе, што је заглавље фајл који је посвећен функцијама који раде са и манипулишу жице. И посебно, оно што ради је стрцмп она пореди вредности две жице. Зато сам хтео да Сегментатион фаулт на позив да стрцмп изгледа. Ударио сам н, и, у ствари, добијем поруку, Програм престаје са сигналом СИГСЕГВ Сегментатион фаулт. Па сад Ја у ствари сец окривио, и мој програм има доста много ефикасније одустао. Ово је крај програма. То се покварио, се срушио. Дакле, није било много, али ја заправо сазнао доста из овог малог искуства. Шта сам научио? Па, мој програм руши прилично одмах. Мој програм пада на позив на стрцмп, али ја немају локалне променљиве у мом Програм у време када се разбије. Па шта стринг или жице, бих могао да будем у односу. Ако немам неки локални варијабле, могао би претпоставити да сам тамо бих-- можда је Глобална променљива, која би могла бити истина. Али уопштено гледано, чини се као да сам у односу на нешто што не постоји. Дакле, хајде да истражи да мало даље. Зато ћу разбистрити екран. Ја ћу да одустанем од од ГДБ окружење за секунду. И ја сам размишљао, у реду, тако да је нема локалне променљиве у мом програму. Питам се да ли можда сам требао да прође у низу као аргумент командне линије. Дакле, хајде да тестирамо ово. Нисам то и раније. Хајде да видимо да ли можда да ли покренути овај програм са командне линије аргумента ради. Ха, не сегментације кривица постоји. То ми је рекао да сам схватио. Дакле, можда је то овде поправити. И заиста, ако се вратим и гледај стварни изворни код за бугги1.ц, изгледа као да оно што радим је Правим позив за стрцмп без провјеру да ли у ствари аргв [1] постоји. Ово је заправо изворни код за бугги1.ц. Дакле, оно што заиста треба да урадимо овде да поправим мој програм, претпостављајући ја имам филе испред мене, је само да додате чек да сигуран да аргц! једнако 2. Дакле, ово пример, опет, као што сам рекао, је мало неприродно, зар не? Ти генерално неће случајно обрисати свој изворни код и онда да покушамо и дебуг програм. Али надамо се, је дао ти једна илустрација од врсте ствари које можете да размишљате о како ви отклањање грешака ваш програм. Шта је стање овде? Шта променљиве И мени имају приступ са мном? Где је тачно мој програм судара, на којој линији, на оно што позив на којој функцији? Какав трагова то ми даје? И то је управо врста размишљања која вас Требало би да се у када сте размишљам о дебуггинг своје програме. Ја сам Доуг Лојд. Ово је ЦС50.