[Powered by Google Translate] GDB, проекта GNU Debugger, е мощен инструмент за откриване на грешки за C, заедно с много други езици. Тя ви позволява да мушкам около във вашите програми C, докато те са изпълнение, и също така ви дава възможност да видите какво точно се случва Когато програмата катастрофи. Това е доста готин, нали? GDB е свободен софтуер, и тя работи много популярни UNIX и Windows-базирани операционни системи, така че е много широко разпространен инструмент. Трябва да се научиш да го обичам. GDB професионалисти имат много по-лесно проследяване на грешки от тези, които разкалвам чрез използване на предположения и безкрайни количества разпечатка отчети. GDB е инструмент за командния ред, което означава, че могат да си взаимодействат с него в терминала издаване на команди чрез клавиатурата, вместо да кликвате бутони с мишката. За да стартирате GDB, буквално само да въведете GDB в командния ред и натиснете въведете. Ще видите някои линии, отпечатани на екрана ви показва версията на GDB, че сте стартирали, си информация за авторските права и в края ще видите GDB ред: (GDB). Това ви позволява да знаете, че GDB е готов за команди. В този момент, най-важното нещо, което трябва да знаете как да направите, е да спреш. За щастие, това е доста проста. Затворите командния прави точно това. Като пряк път, може просто да използвате р. Толкова забавно, колкото зарежда GDB и скоро след това отказване, нека сега поговорим за използването GDB да помогне за отстраняване на грешки на програма. За да започнете, аз имам програма тук в factorial.c , които получава вътр и се опитва да се изчисли факториел. В случай, че не са видели factorials преди или не ги помня, Факториела на числото N е равна на произведението от N (N - 1), (N 2), и така нататък - докато не удари един. Ето защо, факториела на 3 е 3 * 2 * 1 или 6, и факториела на 4 е 4 * 3 * 2 * 1, или 24. Факториела на нула е странен случай, това е 1, и factorials на отрицателни числа не са определени. Както и да е, нещо за факториел ми програма е фънки. Когато го стартирате, отпечатва странни номера, които имат нищо общо с factorials. Така че, можем да използваме GDB да помогне да разбера какво става. GDB работи на изпълними файлове, които са двоични файлове, произведени от процеса на компилация. Това означава, че ние не може да работи GDB на нашия век или з файлове с изходен код като factorial.c. Ние искаме да се изпълнява само факториел вместо. Ако програмата изисква всички аргументи от командния ред, това е мястото, където ние ще ги зададете. В този случай, факториел не изисква никакви аргументи от командния ред, така че ние просто въведете план или R за кратко. Това ще започне факториела работеща програма. Когато програмата спира да работи, ще ми GDB подкани. Добре, нека се опитаме едно и също нещо отново, факториела на 4. Добре, ние виждаме, че сме един и същ вид боклуци тук в GDB. Сега, когато програмата приключи, не можем да отидем и достъп до всеки на своята държава, така че ние ще трябва да започне да тече отново преди да можем да видим какво се случва. Въпреки това, ние се нуждаем от начин да го спрем, докато тя е в средата на своя план. За да направите това, ние използваме това, което се нарича точка на прекъсване. Гранични стойности кажа GDB да направите пауза в програмата на дадена функция или линия на изходния код , така че да можем да проучва състоянието на програмата, стойностите на променливите, състоянието на паметта и такива, в този момент. Тъй като аз наистина не знам къде нещата се объркат, Аз просто искам да започне отстраняване на грешки в самото начало, прав, когато основната започва. Ще зададете точка на прекъсване в началото на главната, с помощта на командата почивка. Можем също да използваме, за да съкрати почивката. Сега нека да стартирате програмата отново. Тук ние сме в началото на главната, точно както GDB ни казва. Линията на кода, който е на път да се изпълни, но все още не е е ФОРМАТ линия. Можем да кажем, GDB, за да се изпълни този ред на кода и да преминете на следващия ред следващата или N команда. Добре, сега GDB ни казва, че ние сме на GetInt линия. Знам, че изглежда като ФОРМАТ линия не работи тъй като ние не виждаме "Въведете цяло положително число" печат на екрана, но тя наистина работи. Това, което виждаме, е операционната система потискат нищо писмено на екрана до абсолютно трябва да, защо дебъгване с разпечатки понякога може да изглежда ненадеждна. Както и да е, нека отново отидете на следващия ред на кода и въведете в вътр. Отново, нека тип 4. Така че това изглежда странно. Ние сме на линия 12 в съответствие с GDB но на следващия ред, който е на път да се изпълни само фигурна скоба. Това просто означава, че ние сме в края на цикъла, ни направи линия, докато в действителност, и GDB ни казва, че прекратяването състояние, а именно никой по-малко от нула, ще изпълни следващата. Ако това някога стане малко объркващо, ние може да тегли до изходния код в GDB със списъка или команда л. Това отпечатва изходния код , която е центрирана около линията, която сме в момента. Ако ние отново въведете списък или литра, ще видим следващия набор от линии разпечатате. Ние можем да направим това, докато не се удари в края на файла. Да се ​​върнем там, където бяхме, ние можем да предоставят списък с номер на ред, в този случай, ред 12. Както и да е, нека продължим нататък. Сега сме на линия 4. Нека се уверим, че нашата бр променлива съдържа 4. Правим това с печат, или стр., команда. Така че, GDB ни казва, че бр наистина е съхраняване на четири, както очаквахме. $ 1, че GDB отпечатва, е специална променлива GDB , която е сега, както и за съхраняване на 4 броя. Можете да игнорирате това за сега, но тези GDB променливи идват в супер удобен в по-напреднали случаи, когато искате да си припомни какво сте правили в миналото. Както и да е, движещи се със следващия, ние виждаме, че ние започваме да се движат чрез линия за. Да продължим от тук с N малко по малко. Вместо да пишете н всеки път, можете да просто да натиснете въведете. Когато натиснете влиза, без да въвеждате нищо, GDB просто повтаря предишната команда. Така че сега сме удари ФОРМАТ повикване. Изглежда, че наистина сме преминали през нашата линия 4 пъти, което е това, което искаме да направим, за да се размножават от 1, 2, 3 и 4. Всичко изглежда като това е работа, с изключение на случаите, когато удари следващия път да се получи това огромен брой вместо на 24. Ако ние изведем стойността на факториел Използване на P, ние виждаме, че факториел има този огромен брой в него. Нещо определено върви на зле. В този момент, обаче, ние сме почти в края на програмата, и да е станало твърде късно, за да се определи нещо. Въпреки това, ние можем да рестартирате програмата, като въведете R отново и след това Y, за да потвърдите. Сега сме в нашия точка на прекъсване в началото на главната. Ние знаем, че всичко изглежда да е наред с четенето в N. така че ние може да скочи напред с N. Освен това, ние да зададете нова точка на прекъсване, след като направи линия, докато и скочи там. Нека го направим. Изглежда, като линия 14 идва точно след приключването на цикъла. Нека да зададете точка на прекъсване. Това е добра практика да укажете името на файла в тази точка на прекъсване команда тъй като GDB да се бърка, ако работите с множество файлове. Да се ​​движи напред на тази точка на прекъсване, ние ще използваме продължи или в команда. Добре, тук ние сме на линия. Да отидем още една линия в линия, и след това ще започне да печата променливи, за да видя какво става. Нека да съм сигурна, че наистина е едно, както се очаква. Да, това е всичко добро. Ами факториел все пак? Уау, това не е добре. Имаме голямо отрицателно число. Как се случи това? Е, ако погледнем назад в кода, ние виждаме, че ние никога не сме го инициализира, така че ние просто трябва боклук там. Това определено ще хвърлят нашите изчисления. За щастие, ние не трябва да напуснат GDB да поправя това. Можем да го инициализира точно тук и го фиксирайте в код по-късно с помощта на командата за печат. Ще го инициализира до 1, тъй като factorials на нула и 1 са на 1, и ако можем да я инициализираме на нула, тогава бихме винаги завършват с нула като нашия резултат. Можете да зададете този начин всяка променлива, която е супер удобен. Сега, нека продължим нашата програма. Нека се уверим, че всичко е там, където е трябвало да бъде. Num трябва да бъде 4, аз трябва да бъде 1, както и факториел трябва да бъде 1 прекалено. Ние можем да съкращаването на този процес и отпечатване на всички от нашите локални променливи със супер-полезни Информация за местните командни, , която отпечатва в обхвата на нашите локални променливи. Както и да е, изглежда, че всичко е добре да тръгвам. Нека да направим друг минаване на втори кръг на цикъла за да съм сигурен. Добре, всичко изглежда страхотно. Сега ние можем да използваме командата продължават да ходят до края. Sweet! 4 факториел отпечатани 24, както се очаква. Сега можем да поправя това в нашия код. Вместо да излезете от GDB, ние ще използваме друг раздел терминал, за да направите това. Ако се върнем към нашия GDB раздела, сега ние трябва да компилирате изпълним. Един от най-добрите неща за GDB е, че не е нужно да напусне GDB да тече направи. Така че ние не спазваме удря старите гранични стойности, нека да ги забраните с, както се досещате, забранете команда. Това ще изключи всички от нашите гранични стойности. Сега можем да рестартирате програмата с R и се уверете, че всичко е наред. Изглежда, че всичко е добре да тръгвам. Повдигане на 4 разпечатки от 24, точно както си мислехме. GDB е един от най-полезните инструменти, които сте получили в инструментариум. Има т повече неща, които можете да правите с GDB, много повече, отколкото можете да правите с прости разпечатки. Следващия път, когато програмата не правите това, което искате, опитайте се да стартирате GDB да разбера какво се случва вътре в. С малко практика, вие ще бъдете в състояние да пробия долу в дясно на вашия бъг в нито един момент. Моето име е Нейт Hardison. Това е CS50.