>> Дъг LLOYD: Добре GDB.
Какво е това по-точно?
Така GDB, която стои за GNU Debugger,
е наистина страхотно средство, което можем да използвате, за да ни помогне да трасира нашите програми,
или разберете къде нещата са наред в нашите програми.
GDB е наистина мощен, продукцията и взаимодействието с него
може да бъде малко по-загадъчен.
Това е обикновено средство за команден ред, и тя може да хвърли много послания към вас.
И това може да ни е трудно да се разбор какво точно се случва.
За щастие, ние сме предприели стъпки да решите този проблем за вас
докато работите през CS50.
Ако не използвате графичния дебъгер, който колегата Dan
Armandarse е говорил доста малко за в едно видео, което
трябва да е тук точно сега, може да се наложи
да се използват тези команди инструменти за работа с GDB.
Ако работите в CS50 IDE, че не е нужно да се направи това.
Но ако не сте работещи в CS50 IDE,
може би се използва версия на CS50 Appliance,
или друга Linux операционна система с GDB инсталиран на него,
може да се наложи да използвате тези средствата от команден ред.
>> И тъй като може да Трябва да направите това, това е
полезно, само за да разберете как GDB работи от командния ред.
Но пак, ако сте използване на CS50 IDE, вие
да използвате графичния дебъгер която е вградена в логическо устройство.
Така че, за да получите неща се случват с GDB, за да започне отстраняване на грешки
процес на конкретен програма, всичко което трябва да направите
се объркат GDB последван от името на програмата.
Така например, ако програмата ви е Здравейте, можете да напишете GDB здрасти.
>> Когато направите това, вие ще да спра околната среда GDB.
Вашият бърз ще се промени, и вместо да бъде това, което обикновено се
е, когато сте написали неща при LS командните line--,
cd-- всичките си типичен Linux команди, бързата си
ще се промени на, може би, нещо, като скоби GDB скоби.
Това е вашият нов GDB бързо, защото ти си вътре в околната среда GDB.
Веднъж влезли на тази среда, Има две основни команди
че най-вероятно ще се използва в следния ред.
>> Първият е, Ь, които е кратък за почивка.
И след като сте написали Ь, вие обикновено въведете името на функция,
или ако се случи да знаете около това, което линия номер
вашата програма започва да се държи малко странно,
можете да въведете ред номер и там.
Какво б, или почивка, прави е тя дава възможност на програма
да тече нагоре, докато един определен момент, А именно, името на функцията
което сте посочили или линията номер, който сте посочили.
>> И в този момент той, ще замръзне изпълнение.
Това е наистина добро нещо, защото веднъж изпълнение е бил замразен,
можете да започнете да много бавно преминете през вашата програма.
Обикновено, ако сте били работи вашите програми, те са доста кратки.
Обикновено, изпишете точка наклонена черта каквото Името на вашата програма е, удари Enter,
и преди да може да започне да мига, вашето програма вече е завършен.
Всъщност не е много време, за да се опита и да разбера какво се случва погрешно.
Така че това наистина да бъде в състояние да забави нещата надолу, като се определи критичната точка с б,
и след това в засилването.
>> Тогава, след като сте настроили вашата почивка момент, можете да стартирате програмата.
И ако имате някакво командния ред аргументи,
можете да ги зададете тук, а не когато изпишете GDB вашето име програма.
Вие посочвате всички командния ред доводи, като предприе г, или писта,
и след това каквото и аргументи от командния ред имате нужда от вътрешността на вашата програма.
Има редица други наистина важни и полезни команди
вътрешността на околната среда на БВП.
Така че нека просто ме бързо разясни някои от тях.
>> Първата е, п, което е съкратено от следващия, и можете да въведете следващата вместо п,
както ще работи.
И това е само стенографията.
И както вероятно вече сте придобили използва, за да е в състояние да объркат нещата
кратък обикновено е по-добре.
И какво ще направи, че е ще крачка напред един блок от код.
Така че ще продължим напред до извикване на функция.
И тогава, вместо да гмурне в тази функция
и преминава през всичко това функции код, той просто ще има функцията.
>> Функцията ще се нарича.
Тя ще направи каквото си работа е.
Той ще се върне на стойност към функцията, която тя нарича.
И след това ще се премине към следващия ред на тази призвание функция.
Ако искате да се оттегли вътрешността на функцията,
вместо просто като го изпълни, особено
ако смятате, че проблемът може да се търси в рамките на тази функция,
бихте могли, разбира се, определен от почивка точка във вътрешността на тази функция.
Или ако вече използвате, можете да използвате и да се изправим един ред код.
>> Така че това ще се намеси и се потопите в функции,
вместо просто да имат изпълнимия и продължаване на във функцията
че вие ​​сте в за отстраняване на грешки.
Ако някога искате да знаете стойността на една променлива,
можете да въведете р или Print, и след това името на променливата.
И това ще отпечата до вас, вътрешността на околната среда GDB,
името на променливата, че you-- me-- извините стойността на променливата
че сте на име.
Ако искате да знаете стойностите на всеки локална променлива достъпна от където
се намирате в момента във вашия програма, можете да въведете информация на местните жители.
Това е много по-бързо, отколкото писането р а след това каквото и да,
листинг извършват всички променливи, че знаете съществуват.
Можете да въведете информация на местните жители, и да го ще отпечата всичко за вас.
Следващата е БТ, което е Накратко Обратно Trace.
Сега, обикновено, особено в началото CS50,
вие няма да имате повод наистина да се използва БТ, или Back Trace,
защото не сте с функции които наричат ​​други функции.
>> Може да се наложи основната един разговор функция, но това е вероятно той.
Не е нужно, че друга функция наричайки друга функция, която
призовава друга функция, и така нататък.
Но като си програми стават все по- комплекс, и по-специално
когато започва да работи с рекурсия, гърба и следа
може да бъде наистина полезен начин да ви разочарова вид получите някакъв контекст, за където
Аз съм в моята програма.
Така казват, че съм написал кода си, и знаете ли, че основната функция призовава
е, в която се призовава функция г, в която се призовава функция ч.
Така че ние имаме няколко слоя на гнездене става тук.
>> Ако сте вътре Вашата GDB среда,
и вие знаете, си вътре на час, но сте пропуснали
за това, което имаш, за да където можете are-- можете да напишете БТ, или обратно проследяване,
и тя ще разпечатате ч, д, е основна, заедно с друга информация, която
дава представа, че основната OK наречен F, е наречен г, д, наречена Н,
и това е, когато съм В момента съм в моята програма.
Така че тя може да бъде наистина полезно, особено след като тайнствено-ността на GDB
става малко поразителен, за да разберете къде точно стоят нещата.
Накрая, когато вашата програма е направено, или, когато сте готови да го отстраняване на грешки
и искате да се излезе от околната среда GDB,
тя помага да се знае как да се измъкнем от него.
Можете да напишете р, или Спри, за да се измъкнем.
Сега, преди днешното видео Аз съм подготвил програма бъги
наречено buggy1, които съм съставила от файл известен като buggy1.c.
Както може би очаквате, това програма е в действителност бъги.
Нещо се обърка когато се опитам и да го ползвате.
Сега, за съжаление, аз по невнимание заличава ми buggy1.c файл,
така че, за мен, за да разбера какво става лошо с тази програма,
Отивам да се наложи да използвате GDB вид сляпо, опитвайки
за да навигирате чрез тази програма, за да разбера какво точно се случва погрешно.
Но като се използва само инструменти вече сме научили за,
можем почти фигура какво точно е то.
Така че нека да се над главата CS50 IDE и имат поглед.
ОК, така че ние сме тук, в моята CS50 IDE среда,
и аз ще я увеличите малко така че можете да видите малко повече.
В моя терминален прозорец, ако аз се изброят съдържанието на сегашния си директор
с LS, ще видим, че аз имам няколко изходни файлове
тук, включително Преди обсъждахме buggy1.
Какво точно се случва, когато Опитвам се и тичам buggy1.
Ами нека да разберете.
Аз написали дот наклонена черта, бъги и ударих Enter.
>> Сегментиране грешки.
Това не е добре.
Ако си спомняте, а сегментацията на вина обикновено
се случва, когато ние достъп до паметта че ние не ти е позволено да се докоснат.
Ние някак си достигнал извън пределите
на което на програмата, компилатор, ни е дал.
И така, вече това е следа да се запази в кутията с инструменти
когато започваме процеса на отстраняване на грешки.
Нещо е отишло малко погрешно тук.
>> Добре, така че нека да започнем до средата GDB
и да видим дали можем да разбера какво точно е проблемът.
Отивам да изчистите екрана си, и аз отивам да се объркат GDB
отново, за да попаднат в околната среда GDB, и името на програмата
че искам да се трасира, buggy1.
Ние се получи малко съобщение, четене символи от buggy1, направили.
Всичко това означава, че е го извади заедно целият код,
и сега той е бил зареден в GDB, и е готов да отида.
>> Сега, какво искам да направя?
Спомняте ли си какво, първа стъпка обикновено е
След аз съм вътре в тази среда?
Надяваме се, че ви серията критичната точка, защото
Всъщност това е, което искам да направя.
Сега, аз не разполагат с изходния код за тази
пред мен, което е най-вероятно Не типичния случай употреба, между другото.
Вие вероятно ще.
Така че това е добре.
Но ако приемем, което правите, не, какво е от една функция, която знаете
съществува във всяка една програма C?
Без значение колко голям или колко сложно е, тази функция определено съществува.
Main, нали?
>> Така че не всичко друго, ние можем да определя критичната точка на основната.
И отново, бих могъл само да въведете пробие основен, вместо б.
И ако сте любопитни, ако някога напишете дълга команда
и след това да осъзнаваш, че си написали нещо погрешно,
и вие искате да се отървете на всички като аз просто направих,
можете да вземете Control U, които ще изтриете всичко и ще ви върне назад
към началото на курсора линии.
А много по-бързо, отколкото просто задръжте натиснат изтриете, или да го удря един куп пъти
над.
>> Така че ние ще постави точка почивка в основното.
И както можете да видите, тя казва, ние сме определя критичната точка на файл buggy1.c,
и очевидно първа линия на код на основната линия е седем.
Отново, ние нямаме изходния файл тук,
но аз ще приемем, че това е ми казва истината.
И след това, аз просто се опитвам и стартирайте програмата, г.
Стартиране на програмата.
Добре, така че това съобщение е малко загадъчен.
Но в общи линии това, което е случва тук, е че това е просто
ми казва че съм тежко ми почивка точка, брейк пойнт номер 1.
>> И след това, че ред код, няма такъв файл или директория.
Единствената причина, че Виждам, че съобщение
е така, защото аз по невнимание заличава ми buggy.c файл.
Ако ми buggy1.c файл съществува в текущата директория,
това право линия всъщност би да ми каже какво линията на код
буквално гласи.
За съжаление, аз го изтрили.
Отиваме да се наложи да се движите вид чрез това малко по-сляпо.
>> ОК, така че нека да видим, какво искам да правя тук?
Е, аз бих искал да знам какво местно променливи може би са на разположение за мен.
Аз започнах моята програма.
Нека да видим какво може да е вече инициализира за нас.
Аз написали места на местните жители, никакви местни жители.
Добре, така че не го прави дайте ми един тон на информация.
Можех да се опита и да разпечатате променлива, но аз не знам никакви имена на променливи.
Ще опитам задна следа, но аз съм вътре в основната,
така че аз знам, че не са направили друга функция разговор точно сега.
>> Така изглежда само моите възможности са да се използва п, или така и да започне да се потопите инча
Отивам да се използва п.
Така че аз написали п.
О, Боже, какво се случва тук.
Програма получили сигнали, Сегментацията на вина SIGSEGV,
и след това цял куп неща.
Вече съм съкрушен.
Е, има всъщност много да се научи тук.
И така, какво говори това?
Какво ни казва е, тази програма е път да, но има все още, сегменти вина.
И по-специално, аз отивам за да я увеличите още повече тук,
тя е на път да SEG вина за нещо, наречено strcmp.
>> Сега, ние не може да го обсъдили тази функция широко.
Но това is-- защото ние не отиваме да се говори за всяка функция, която
съществува в стандарта C library-- но всички те са достъпни за вас,
особено ако вземете Посетете reference.cs50.net.
И strcmp е наистина мощен функция, която съществува вътре
на string.h хедъра файл, който е с глава
файл, който е посветен на функции че работата с и манипулират струни.
>> И по-специално, това, което прави, е strcmp той сравнява стойностите на две струни.
Така че аз съм за да сегментацията на вина по време на разговор, за да strcmp изглежда.
Ударих п, а в действителност получавам съобщение, програма за прекратено по сигнал SIGSEGV
сегментацията на вина. Така че сега Аз всъщност са сегменти обвиняван,
и моята програма има доста много по-ефективно да се отказали.
Това е края на програмата.
Той събори, той разбил.
Така че не е много, но аз всъщност научих доста малко
от този малък опит.
Какво съм научил?
Е, моята програма катастрофи почти веднага.
Моята програма се разби при призив към strcmp, но аз
нямат никакви локални променливи в моята Програма по времето, когато забие.
И така, какво низ, или струни, бих могъл да се сравняват.
Ако аз не разполагат с никакви местно променливи, може да се
предположим, че аз have-- там може би е глобална променлива, която може да е вярно.
>> Но като цяло, изглежда, сякаш съм сравняване
на нещо, което не съществува.
Така че нека да разследва че малко по-нататък.
Така че аз отивам да изчистите екрана си.
Отивам да излезете от GDB среда за секунда.
И аз съм мисля, OK, така че има няма местни променливи в моята програма.
Чудя се, ако може би аз съм трябвало да мине в низ като аргумент на командния ред.
Така че нека просто тествате това.
Не съм го и преди.
>> Да видим дали може би ако го стартирам тази програма с аргумент на командния ред, че работи.
Ъ, не сегментацията на вина там.
Той просто ми каза, че съм го измисли.
Така че може би това е уговорката тук.
И наистина, ако се върна и да разгледаме действителната изходния код за buggy1.c,
тя изглежда така, сякаш това, което правя, е Аз съм на повикване, за да strcmp без
проверка на това дали в действителност argv [1] съществува.
Това е всъщност най- изходния код за buggy1.c.
Така че това, което наистина трябва да се направя тук, за да се определи моята програма,
ако приемем, имам подаде пред мен, е
просто да добавите проверка, за да се направи уверите, че argc е равно на 2.
Така че този пример, отново, както казах, е малко измислен, нали?
Вие като цяло няма да случайно изтриване на изходния код
и след това трябва да се опита и отстраняване на грешки в програмата.
Но да се надяваме, да го даде можете илюстрация
от видовете неща, които бихте могли да се мисли за
като сте коригирането на грешките в програмата.
>> Какво е състоянието на нещата тук?
Какво да направя, променливи имат достъп до мен?
Къде точно е моята програма трясък, върху това, което линия,
върху това, което повикване до каква функция?
Какви улики се, че ми даде?
И това е точно вид мислене, че сте
трябва да се забъркват, когато сте мисля за отстраняване на грешки на вашите програми.
>> Аз съм Дъг Лойд.
Това е CS50.