Даг LLOYD: Добро gdb. Што е тоа точно? Па GDB, која се залага за GNU Дебагерот, е навистина страшно алатка која може да се користите за да ни помогне да се debug нашите програми, или да дознаете каде што нештата се ќе е во ред во нашите програми. GDB е неверојатно моќен, но производството и интеракција со него може да биде малку криптичната. Тоа е обично алатка со командна линија, и тоа може да фрли многу пораки во вас. И тоа може да вид на тешко да анализирам токму она што се случува. За среќа, ние сме земени чекори да го надминете овој проблем за вас како што работат преку CS50. Ако не сте со користење на графичкиот дебагерот, што мојот колега Дан Armandarse зборува доста за малку за тоа во видео кое треба да биде овде во моментов, може да треба да ги користат овие за командната линија алатки за работа со gdb. Ако си работат во CS50 ИРО, вие не треба да се направи ова. Но, ако не сте работат во CS50 ИРО, можеби со помош на верзијата на CS50 апаратот, или друг Linux оперативниот систем со GDB инсталиран на него, можеби ќе треба да ги користат овие алатки за командната линија. И бидејќи можеби ќе мора да го направите тоа, тоа е корисно само за да се разбере како GDB работи од командната линија. Но, повторно, ако сте користење на CS50 ИРО, може да ги користите графичките дебагерот кој е изграден во ИРО. Така да се работи ќе со GDB, за да ја стартувате дебагирање процесот на одредена програма, се што треба да е тип GDB проследено со името на програмата. Така на пример, ако вашата програма е здраво, ќе напишеш GDB здраво. Кога ќе го направите тоа, ќе си оди да се повлече до средина gdb. Вашата линија ќе се промени, и наместо да бидат она што обично е кога ќе напишете работите на ls команда line--, cd-- сите од вашиот типичен Линукс команди, вашата линија ќе се смени, веројатно, нешто како загради GDB загради. Тоа е вашиот нов GDB брза, затоа што ти си во внатрешноста на животната средина gdb. Откако во внатрешноста на таа средина, има два големи команди кој најверојатно ќе се користи во следниов редослед. Првиот е б, кои е краток за пауза. И откако ќе ја напишете б, обично напишете името на некоја функција, или ако се случи да знаете околу она што линијата број Вашата програма ќе почне да се однесува малку чудно, можете да напишете линија број и таму. Што б или пауза, дали е тоа што им овозможува на вашата програма да се кандидира до една одредена точка, имено, на името на функцијата што ќе се определи или линијата број, кој сте го одредиле. И во тој момент тоа, ќе се замрзне извршување. Ова е навистина добра работа, бидејќи еднаш извршување е замрзнат, Можете да почнете да многу бавно чекор преку вашата програма. Обично, ако сте биле водење вашите програми, тие се прилично кратко. Обично, ќе напишете дот што и коса црта името на вашата програма, притиснете ентер, и пред да може да трепка, Вашиот Програмата е веќе завршена. Тоа не е навистина многу време за да се обиде и да дознаам што се случува во ред. Значи, тоа навистина да се биде во можност да го забават работите надолу со поставување брејк со б, а потоа се повлекува. Потоа, откако ќе го поставите вашиот одмор точка, можете да ја стартувате програмата. И ако имате било какви командната линија аргументи, ќе ги наведете тука, а не кога GDB го напишете вашето име програма. Ќе се определи сите командната линија аргументи, со преземање на R, или рок, а потоа било аргументи на командната линија ви треба во на вашата програма. Постојат голем број на други навистина важни и корисни команди внатрешноста на животната средина на БДП. Па ме пушти само брзо одиме во текот на некои од нив. Првиот е n, која е краток за следната, и можете да напишете следниот наместо n, и ќе работи. И тоа е само на стенографија. И како што сте веројатно веќе добиле користи за да се, да се биде во можност да напишеш работи пократок општо е подобра. А што тоа ќе го направи тоа ќе чекор напред еден блок од код. Па тоа ќе се оди напред до повик на функција. А потоа наместо нурнувајќи се во таа функција и да одите низ сето тоа функционира код, тоа само ќе имаат функција. Функција ќе бидат повикани. Тоа ќе го направи она што во неговата работа. Тоа ќе се врати на вредност за функцијата што го нарече. А потоа ќе се движи кон следната линија на тој повик функција. Ако сакате да се повлече во внатрешноста на функцијата, Наместо да има само го изврши, особено ако мислите дека проблемот може да лежи во внатрешноста на таа функција, Можете да, се разбира, во собата на пауза укажуваат внатрешноста на таа функција. Или ако сте веќе работат, можете да користат и да се чекор напред една линија код. Така што ова ќе чекор во и се нурне во функции, наместо само да имаат изврши и понатаму продолжуваат во функција дека ти си во за дебагирање. Ако некогаш сакате да ги знаете вредноста на променлива, можете да напишете р, или печатење, а потоа името на променливата. И дека ќе се печати на тебе, во внатрешноста на животната средина GDB, име на променлива, што you-- me-- изговор на вредноста на променливата дека сте именуван. Ако сакате да знаете што вредностите на секој локална променлива достапен од каде што во моментов се во вашата програма, можете да напишете инфо локалното население. Тоа е многу побрзо од пишување p и тогаш што и да, листата од сите на променливи што ќе знаат да постои. Можете да напишете инфо локалното население, и тоа ќе се печати сè за вас. Потоа е БТ, што е краток за назад трага. Сега, генерално, особено на почетокот CS50, Вие навистина не ќе имаат прилика да се користи БТ, или назад Рута, затоа што не си се има функции кои се нарекуваат други функции. Може да имаат главна повик функција, но тоа е веројатно тоа. Немате таа друга функција повикувајќи друга функција, која повикува друга функција, и така натаму. Но, како што вашите програми да добиете повеќе комплекс, а особено кога ќе почнат да работат со рекурзија, назад во трагови може да биде навистина корисен начин да ти дадам вид на се добијат некои контекст за каде Јас сум во мојата програма. Така да се каже што сте го напишале вашиот код, и знаете дека главен повикува функција ѓ, кој повикува на функција г, со што се доведува во функција ч. Па ние имаме повеќе слоеви на вгнездување случува тука. Ако сте во внатрешноста на Вашиот GDB средина, и знаеш вашиот внатрешноста на часот, но ја заборавите во врска со она што го добив на местото каде што are-- можете да напишете БТ, или назад во трагови, и тоа ќе се печати ч, г, ѓ главната, заедно со некои други информации, кои ви дава индикација дека, во ред главната наречен F, ѓ повика г, г наречен ч, и тоа е каде што Во моментов сум во мојата програма. Па тоа може да биде навистина корисно, особено како криптичната-Нес на GDB станува малку преголема, да дознаете точно каде работите се. Конечно, кога вашата програма е направено, или кога ќе завршиш тоа дебагирање и ако сакате да се чекор подалеку од околината GDB, тоа им помага да се знае како да се излезе од неа. Можете да напишете q, или да престанам, да излезат. Сега, пред денешната видео Јас изготви програма кабриолет наречен buggy1, за што јас состави од датотека познат како buggy1.c. Како што може да се очекува, ова Програмата е во фактот кабриолет. Нешто тргне наопаку кога се обидувам и да ја стартувате. Сега, за жал, јас ненамерно избришан мојот buggy1.c датотека, па со цел за мене да дознаам она што се случува во ред со оваа програма, Јас сум ќе мора да се користи GDB вид на слепо, обидувајќи да се движите низ оваа програма да се дознаам што точно се случува во ред. Но само со користење на алатки ние веќе сте научиле за, можеме да доста фигура што точно е тоа. Па ајде да минете во текот на CS50 ИРО и да го погледне. Добро, така што ние сме тука во мојата CS50 ИРО животната средина, а јас ќе зумирате малку па можете да видите малку повеќе. Во мојот терминален прозорец, ако јас листата содржината на тековната ми директор со ЛС, ќе се види дека јас имаат неколку изворни датотеки тука, вклучувајќи го претходно дискутирано buggy1. Што точно се случува кога Се обидувам и да ја стартувате buggy1. Па ајде да дознаете. Јас тип точка коса црта, кабриолет, а јас притиснете Enter. Сегментација грешки. Тоа не е добро. Ако се сеќавате, на сегментација на вина обично се случува кога ние пристап меморија дека не ни е дозволено да се допре. Ние сме некако достигна до надвор од границите на она што на програмата, компајлер, ни ги даде. И така веќе тоа е поим за да се задржи во алатникот како што ние почнат процесот на дебагирање. Нешто тргна малку ред овде. Добро, па ајде да почнеме Регистрација на животната средина GDB и да видиме дали можеме да дознаам што точно е проблемот. Одам да го исчистите мојот екран, а јас ќе одам да напишеш GDB повторно, да се влезе во животната средина GDB, и името на програмата што сакам да debug, buggy1. Да добиеме малку порака, читање симболите од buggy1, направено. Сето тоа значи дека е се повлече заедно сите на кодот, а сега тоа е се вчита во GDB, и тој е подготвен да си замине. Сега, она што сакам да направам? Се сеќаваш ли на она што Првиот чекор обично е откако сум во внатрешноста на оваа средина? Се надевам, ти рече поставена брејк, бидејќи всушност, тоа е она што сакам да го направам. Сега, јас не имаат изворниот код за ова пред мене, што е веројатно не типичен случај употреба, од страна на патот. Вие веројатно нема. Па тоа е добро. Но под претпоставка дека не, што е онаа функција што го знаеш постои во секоја програма Ц? Без разлика колку големи или како комплицирано тоа е, оваа функција дефинитивно постои. Главната, нели? Така што не се друго, можеме да постави го направите точка пауза со главни. И повторно, јас само може да напишеш скрши главна, наместо б. И ако сте љубопитни, ако некогаш тип надвор долго команда а потоа сфати дека вие внесе нешто погрешно, а вие сакате да се ослободите на сите како што скоро сторив, можете да ја преземат контролата У, кој ќе избришете сè и донела до почетокот на курсорот линии. А многу побрзо отколку само држете го бришење или удирање тоа еден куп пати завршена. Па ние ќе се постави точка пауза со главни. И како што можете да видите, тоа вели дека ние сме постави го направите точка пауза со датотека buggy1.c, и, очигледно, на првата линија на кодот на главната линија е седум. Повторно, ние немаме изворната датотека тука, но јас ќе се претпостави дека тоа е ми ја кажува вистината. И тогаш, јас сум само се обидува и да ја стартувате програмата, р. Почнувајќи програма. Добро, па оваа порака е малку криптичната. Но во основа она што е случува овде е тоа е само ми велеше дека сум го погоди мојата пауза точка, брејк број 1. И тогаш, што линија код, Нема таква датотека или директориум. Единствената причина заради која Јас гледам дека пораката е затоа што ненамерно избришан мојот buggy.c датотека. Ако мојата buggy1.c датотека постоел во тековниот директориум, тоа право линија таму, всушност, би да ми кажете што линијата на кодот буквално гласи. За жал, јас тоа го бришат. Ние ќе треба да се има да се вид на движите преку овој малку повеќе слепо. Добро, па ајде да видиме, што сакам да се направи во оваа ситуација? Па, јас би сакал да знам што локалните променливи можеби се достапни за мене. Почнав мојата програма. Ајде да видиме што може да биде веќе иницијализиран за нас. Јас тип Информации за локалните жители, нема локални жители. Добро, така што не го прави тоа ми даде еден тон на информации. Можев да се обиде и да се печати една променлива, но јас не познавам ниеден променлива имиња. Јас може да се обидат назад трага, но јас сум во внатрешноста на главниот, па знам јас не го направија уште еден повик на функција во моментов. Па изгледа само моите опции се да се користи n или па и да почне да се избањаат. Одам да се користи n. Па јас тип n. Ох Боже, што се случува овде. Програма доби сигнали, Сегментација на вина SIGSEGV, а потоа и целиот куп на работи. Јас сум веќе совладан. Па, таму е всушност многу да се научи тука. Значи она што ни кажува ова? Што ни кажува што е, оваа програма е за да, но се уште не, СКГ вина. А особено, јас ќе одам за да зумирате и подалеку тука, тоа е за да СКГ вина за нешто што се нарекува strcmp. Сега, ние не може да се дискутира оваа функција опширно. Но тоа is-- затоа што не си оди да се зборува за секоја функција што постои во стандарден C library-- но сите тие се на располагање на вас, особено ако се земе погледнете reference.cs50.net. И strcmp е навистина моќна функција што постои во на string.h глава датотека, која е со глава датотека која е посветена на функции кои работат со и да манипулира со жици. А особено, она што го прави е strcmp тоа се споредува вредностите на две жици. Значи јас сум за на сегментирање на вина на повик да strcmp што изгледа. Јас хит n, и всушност јас се добие порака, Програмата е прекината со сигналот SIGSEGV сегментација на вина. Па сега Јас всушност го обвини секунда, и мојата програма има доста многу ефикасно откажале. Ова е крај на програмата. Тоа се расипа, се урнал. Па не е многу, но јас всушност не научи доста од овој малку искуство. Што научив? Па, моето програма падне доста веднаш. Мојата програма се урна на на повик да strcmp, но јас немаат никакви локални променливи во мојата програмата на време дека ќе пропаднат. Значи она што низа, или жици, можев да се споредуваат. Ако јас не се имате било какви локални променливи, можеби ќе претпоставиме дека јас have-- таму можеби е глобалната променлива, што би можело да биде вистина. Но, генерално, се чини како да сум споредување до нешто што не постои. Значи, да се испита дека малку понатаму. Па јас ќе одам да се расчисти мојот екран. Одам да се откажат од GDB средина за една секунда. И јас сум размислување, во ред, па постои Нема локални променливи во мојата програма. Се прашувам дали можеби и јас сум би требало да помине во низа како аргументи на командната линија. Па да тестираат ова. Јас не го направиле тоа порано. Ајде да видиме дали можеби ако јас ја извршите оваа програма со аргументи на командната линија тоа функционира. Нели, не сегментација вина таму. Тоа само ми кажа дека сум го сфатиле. Па можеби тоа е фикс тука. И, навистина, ако се вратам и да се погледне во вистински извор код за buggy1.c, се чини како што правам е Јас сум правење на повик без да strcmp проверка дали всушност avg [1] постои. Ова е, всушност, изворниот код за buggy1.c. Значи она што навистина треба да се направите тука за да го поправи мојата програма, претпоставувајќи имам поднесе пред мене, е само да го додадете чек да се направи дека argc е еднакво на 2. Така овој пример, повторно, како што реков, е малку измислена, нели? Обично не се случува да случајно избришете вашиот изворен код а потоа мора да се обиде и debug на програмата. Но се надевам, го даде ви илустрација на видовите на работи кои ќе може да се размислува за тоа како сте дебагирање на вашата програма. Што е состојбата на работите во оваа ситуација? Она што можам да направам променливи имаат достапни за мене? Каде што е мојата програма паѓа, на она линија, на она што повик за она што функција? Каков вид на индиции, дали тоа ми даде? И тоа е токму вид на начин на размислување дека ќе се треба да се навлегува во кога сте размислување за дебагирање вашите програми. Јас сум Даг Лојд. Ова е CS50.