[? ДАН ARMADARAS:] Здраво, Јас сум [? Дан Armadaras?]. Денес, ние ќе треба да да се гледа во дебагирање. Не само што ќе се дојде до се зборува за некои техники, но исто така и ние ќе треба да се погледне во некои од карактеристиките содржани во рамките на CS50 ИРО, што овозможуваат лесно debug програма. Само еден пример на нешто што може да тргне наопаку а тоа е всушност нешто дека веќе не сум видел. Во овој случај, тоа е С програма кое ќе ја прифати цел број од страна на корисникот, го дели со два, и обезбедува на излез назад до корисникот. Сега од она што сум го видел претходно во предавања, сите знаеме дека тоа, всушност, ќе предизвика одредени видови на поделба проблеми кога имаме непарни броеви. Поточно, ние само ќе се фрлаат нешто по децималната точка. Сега, знаеме дека ова се случува да биде случај. И ако можеме да ја стартувате тоа, ние може да се потврди нашите сомневања, прво, со составувањето. И тогаш, од страна на водење и влегуваат непарен број. Ова не е ништо ново. Но, ова е всушност пример за грешка што може да постои во рамките на поголем програма дека станува потешко да се пронајде. Иако знаеме што ова прашање е, вистинската суштината на предметот може да се обидува да се идентификуваат конкретно каде грешката, идентификување на она што тој проблем е, и тогаш тоа одредување. Така обезбеди ова како пример на она што може да биде нешто дека ние веќе знаеме, но може да биде погребан во рамките на други елементи на кодот. Па отворањето на оваа друг извор код на датотеки како на пример, оваа поделба проблемот сега е дел од поголема програма. Се уште може да биде малку малку измислена, а ние Може да биде во можност лесно да го идентификуваат, особено бидејќи ние сме само се разговара за ова. Но, можеме да дознаам дека ова Проблемот може да постои во поголеми размери. Ако јас ги собере тие и сега се кандидира тоа, внесете непарен број, можеме да видиме дека ние не се токму излезната дека ние може да се очекува. Во конкретниов случај, може да се каже дека ние сакате да смета на сите на броеви од една до некој одреден број. И ние може да се види дека ние имаат различни прашања тука ако ние сме Ставање, едноставно, 0 и 1, кога ние се обезбеди влез на 5. Така што веќе знаете дека има еден проблем тука. Но, ние не можат да знаат точно каде што ова прашање всушност постои. Сега е еден од начините на кои можеме да се обидеме да го надминете овој е нешто што ние сме веќе е запознаен со. Ние само може да го користи во поголеми размери. На линија 14, имаме printf оваа функција, која ни овозможува да испечатите на државата на различни парчиња на информации. И ова е нешто што можете треба да се потпора во рамките на својата програма да се обиде да дознаам што точно е случува во различни линии на код. Па дури и ако тоа не е Конечниот резултат дека ние всушност сакаат да произведуваат од оваа програма, ние се уште може да има некои debug извештаи, каде што може да се обиде да дознаам она што се случува во внатрешноста на нашиот код. Значи во овој случај, јас ќе printf со таг дебагирање. Во овој случај, тоа е само низа debug дека јас сум до-ставање, така што станува многу јасно во производството на мојот код што е тоа што сакам да ви покажам. И излез тука бројот кои го пресметавме. Во овој случај, би можел сакаат да знаат за што точно она што се случува пред и по некои специфични пресметка. Па јас би можеле да го користите printf пред и после тоа линија код. Во овој случај, јас дури би можеле направи тоа малку повеќе јасно велејќи debug пред и debug по толку дека јас не си се мешаме со повеќе линии кои изгледаат идентични. Сега ако ние го прекомпајлирате ова и да ја стартувате тоа, внесете број како пет повторно, можеме да видиме дека имаме сега излез пред и потоа и да се најде дека не сме го направиле јасна или да се има јасна поделба на бројот дека ние всушност сакаме да правиме. Сега, во овој случај, ова е навистина не е јасно излез. Тоа не е навистина јасен исход кој ние сакаме од оваа конкретна програма. А тоа е, повторно, малку измислена. Но, можеби, една од работите кои ние би можеле да се прави ако спецификација рече дека ние сакаме да ја подели оваа страна 2 и додадете 1-- Значи со други зборови, ние сакаме да се заокружи up-- потоа ние би можеле да знаат дека ние би можеле да го направи тоа нешто, во овој случај. Сега тука ние знаеме дека ќе бидеме можност да го додадете 1 до нашите преполовен број. Ајде да го прекомпајлирате ова и да се потврди дека овој се однесува на начинот на кој сакате да го. Можеме да видиме дека сега пред има, имаме бројот 5. Откако, имаме бројот 3, која според нашите спецификација, е она што сакав да го направам. Но, ако го погледнеме излез тука, можеме да се види дека ние би можеле да имаат уште една бубачки целосно, која е кој го започнуваме нашиот Грофот од 0. Сега повторно, ова е нешто што сме го виделе во минатото а ние може да се поправи многу лесно. Но, во овој случај, ние исто така, беше во корист на користење на изјавата на printf директно во внатрешноста на за телефонска линија да се знае точно каде дека грешка е што се случуваат. Па printf извештаи се многу корисна во помагањето да се утврди каде што, токму во вашиот изворен код, специфична грешка се случува. И тоа е исто така важно да се сфати дека, како што ние сме пишување код, би можеле да имаат претпоставки во врска со состојбата на програмата. Или можеби имаме претпоставки за тоа што се дел од програмата е, всушност, точни или неточни кога подоцна како ние се изгради врз програмата и тоа е дел од се направи комплексен и поголем програма што сфаќаме дека некои аспекти на кој е всушност кабриолет. Користење printf навистина може да помогне стесните и да ги идентификува регионите на програма со која може да не се однесуваат токму на начинот на кој ние Очекуваме, врз основа на нашите претпоставки. Но, има и други алатки на располагање, како и, кои ни овозможуваат да се обиде да дознаам каде грешка се случува и, исто така, посебно, што работи се случува во внатрешноста на програмата. Па со користење printf е многу корисно кога сакаме да се идентификуваат специфични области на програма со која има некои багови. Но, тоа, исто така, станува мачна по некое време. Во овој случај, тоа е релативно едноставна програма со само една или две променливи. И станува многу лесно за нас да печати вредноста на овие променливи во контекст на пошироката програма. Но, ние би можеле да имаат различни програма која има многу променливи. И тоа не може да биде доста така лесно да го користите printf да се обиде да се оцени она што се случува на секое еден од овие променливи како на програмата се извршува. Има програма која постои наречен програма дебагерот. Во овој случај, онаа која ние ќе употреба е дебагерот GNU или GDB, која ни овозможува да се изврши увид во внатрешната работата на програмата во многу повеќе детален начин. Ние всушност може да се изврши GDB од командната линија тука со едноставно внесување на GDB и команда која сакаме да debug. Во овој случај, брои. Сега, во овој случај, може да се види дека тоа нè доведува до брза која вели gdb. И ние всушност може да извршување на команди за да GDB всушност да започне извршување на програма, го спречи тоа на некои места, оцени променливи и врши увид на променливи кои постојат во државата на програмата во тој одреден момент, и така натаму и така натаму. Тоа обезбедува многу моќ за нас. Но, тоа само така се случува, дека ИРО CS50 исто така обезбедува GUI или корисник интерфејс за gdb дека ни овозможува да го направите тоа без потреба интерфејсот на командната линија она или на сите, дури и. Начинот на кој што можам да пристапите дека е со користење на копчето debug во самиот врв на CS50 ИРО. Сега и во минатото, она што го имаме види е дека ние ги користиме командата линија за да ги собере и потоа да ја стартувате програмата. Копче за дебагирање прави и двете од овие чекори. Но, тоа, исто така, ќе донесе до табот дебагер на екстремната десница која ни овозможува да се изврши увид на различни на својства на програмата како што е извршување. Ако јас кликнете дебагирање, во овој случај, тоа ќе доведе до ново јазиче во конзола прозорец на самото дно. И може да се види дека ова јазиче има некои информации во самиот врв. И во голема мера може да се игнорира овој. Но една од работите дека ние сакаме да се забележи е дека тоа излези истото што ние ќе се добие ако се обиде да се кандидира за да програмата C во терминален прозорец. Тука може да се види тоа е водење ѕвекот, и има голем број на знамиња, и тоа е составувањето нашите count.c датотека, кој бил одбран табот во времето дека јас хит дебагирање. Значи ова е многу корисно затоа сега со помош на ова копче за дебагирање, истовремено можеме да го компајлира, а потоа изврши програмата дека ние всушност сакате да се кандидира. Еден од знамиња што е важно, во овој случај, ние сме всушност биле користење за најдолго време но, исто така, само не некои рака мавтајќи [Беззвучен], што е овој овде. Во ѕвекот, таа вели -ggdb3. Во овој случај, тоа што сме кажувам ѕвекот, нашите компајлер, е дека ние сакаме да ги собере нашата програма. Но, исто така, даваат какви се наречен информации симбол така што на компајлерот, всушност, има пристап до голем број на основните информации содржани во рамките на програмата. Поконкретно, на бројот на функции кои ги имам, имињата на тие функции, променливи, видовите дека овие променливи се, и разновидност на други нешта кои им помагаат на бубачки ја врши својата работа. Сега има нешто друго тоа е важно да се спомене кога ние сме дискутирање трчање програма на овој начин. Забележи дека тоа, всушност, израснати ново јазиче во нашата конзола по дното. Ние веќе не треба да комуницирате директно со терминален прозорец. Но, ова е ново јазиче всушност терминален прозорец. Тоа едноставно е специфична за трчање програма што ние направивме. Забележи дека на дното, во комбинација со некои излез со ѕвекот компајлерот и GDB, која во голема мера може да се игнорира, тоа всушност покажува излез на нашата програма на самото дно. Сега е важно да сфатат дека тоа, всушност, еден прозорец ќе ви го покаже излез од вашата програма но исто така може да се прифати влез за таа програма, како и. Така вели дека огласот Ве молиме внесете број, кој е ист излез што го имавме имаше во терминален прозорец порано. Но тоа сега е прикажано во овој нов таб. Можам да го внесете бројот. И тоа, всушност, ќе функција како што се очекува покажувајќи ни нашите дебагирање, излез, на излез што може да биде кабриолет, како што не сум видел. И на самото дно, таа всушност, има некои дополнителни излез од БДП само велејќи дека оваа програма има завршено. Сега како што видовме во оваа Особено ја извршите преку, тоа не е особено корисно затоа што дури иако имавме менито дебагерот доаѓаат нагоре, ова беше уште една трчање програма. Во ниту еден момент го направив тоа, всушност, откажеш извршување за нас да бидат во можност да ги провери сите променливите содржани во себе. Има нешто друго дека ние треба да се направи со цел да се добие GDB да се признае дека ние сакаме за да го паузирате извршување на програмата а не само да му се овозможи да се продолжи нормално, исто како што би во било кој друг случај. Со цел да се откажеш извршување, во некоја одредена линија, ние треба да се создаде она што е нарекува брејк. И пауза точка е многу лесно да се создаде во овој CS50 ИРО со преземање на вашиот глушец и кликнете директно на лево на некои специфични бројната оска. Откако го направи тоа, црвена точка се појавува, што укажува на дека таа линија е сега брејк. И следниот пат кога ќе ја извршите GDB тоа, ќе го запре извршувањето на таа брејк кога ќе се достигне таа линија код. Сега, ова е важен нешто да се реализира дека тоа не е нужно случај дека секоја линија на кодот е всушност достапна. Ако јас да се создаде функцијата до тука, за example-- неважечки f-- и само го прават печати линија here-- здраво world-- ако никогаш не сум се јавите на оваа функција, тоа ќе биде случај, ако јас во собата брејк тука, функцијата никогаш нема да се нарече. И затоа, овој Особено брејк никогаш нема да всушност пауза извршување на програмата. Па да речеме дека јас се создаде правилно брејк на некои линија на кодот кои, всушност, ќе биде убиен. Сега, во овој случај, тоа е првата линија во главната функција. Така што сигурно ќе биде случај дека, штом ќе започне извршување, на првата линија ќе биде постигнат. GDB ќе паузира извршување. И тогаш, јас ќе бидам во можност да се комуницирате со дебагер. Можете да го поставите на повеќе линии поминувања, ако би сакал. Ние, исто така, може да се создаде замена тука во овој сегмент на кодот што никогаш нема да се постигне. И ние исто така може да се постави еден подолу. Од причина што ние би сакате да го направите ова ние ќе одат во малку повеќе детали во само еден миг. Значи сега за сега, дозволете ми да го исклучите овие дополнителни брејк така што можеме да погледнеме во она што се случува кога имам една единствена пауза точка во мојата програма. Јас го направив некои промени во оваа програма. Значи ми треба да ја зачувате. Јас ќе кликнете debug, така што можам започне составувањето и потоа извршување на дебагерот. Ќе видиме дека, по моменти, линија која ние избран за пауза точка и се означени со жолта боја. Ние, исто така, може да се забележи дека во горниот десен во debug панел дека иконата пауза се претвори во една мала икона на сцена. Ова значи дека имаме пауза извршување, во конкретниов случај. И притискање на копчето PLAY ќе ни овозможи да продолжи со извршувањето во тој одреден момент. Забележите дека има неколку други копчињата на располагање во овој debug панел, исто така. Чекор во текот, која ми дозволува да изврши дека една линија код и се повлече во текот на таа линија на следната, која, во овој случај, би значело дека на printf изјава се извршува. И тогаш ќе паузира извршување на линија 13, како и толку. И таму е исто така еден чекор во функција, која е корисно ако јас се создаде други функции на друго место во изворниот код. И сакам да се повлече во тие функции, наместо извршува таа функција во целина. Но, ние ќе се погледне повеќе во чекор во функција во само еден миг. Сега забележите некои други работи кои навистина постојат во рамките на оваа debug панел. Имаме оваа панел наречен јавете оџакот, која ни го покажува каде точно сме. Во овој случај, ние сме внатре на главната функција. Нашиот скрипта се нарекува count.c. И ние се случи да биде на линија 13, колона еден, што е токму она што го означениот регионот на изворниот код покажува, како и. Сега се забележи дека ова покажува, исто така, под локална променлива секција сите променливи кои постојат во рамките на оваа функција. Тоа е важно да се напомене дека сите променливи ќе се појави во оваа локална променлива делот во функција, дури и пред тие да бидат дефинирани. Можеме да видиме дека овде имаме една променлива наречен бр, има стандардна вредност од 0, и тоа е од тип int. Сега пред ние всушност се иницијализира сите овие променливи, ние не се нужно загарантирани за да ја видите вредноста на 0. И во зависност од другите егзекуции кои сте ги вршат и состојбата на вашата меморија кога вие всушност ја извршите оваа програма, можете да најдете дека сте не гледам вредности од 0 и, наместо тоа, на некои други луда броеви. Но, не грижете се за тоа. Тоа нема да биде релевантна до што всушност се иницијализира вредноста. Сега, во овој случај, можеме да видиме дека Имам извршени некои излези. И јас сум, во моментов, на пауза извршување. Но, во овој случај, она што Јас навистина сакате да го направите е сега се повлече во текот на оваа линија на кодот, така што јас всушност може да барањето на корисникот за таа цел број кој сакаме да го користиме во нашата програма. Сега, во овој случај, кога Јас хит чекор во текот, огласот дека Пауза или, поточно, Resume копче за да го смени ова копче за пауза затоа што овој код е всушност извршување. Што се случува во моментов е дека тоа е чека на нас да го внесете некои информации како што може да се види од страна на нашите излез текст на самото дно. Значи, токму сега, тоа е всушност, не се на пауза, и покрај тоа што, на некој начин се појавува, да биде, бидејќи ништо не се случува. Но, тоа само така се случува, дека во мојот конкретен случај на линија 13, Јас сум на чекање за корисникот влез. И така GDB не е во можност да се испита програма како што се работи. Сега следниот пат гледам дека влегуваме во некој input-- па јас ќе го внесете тој број 5, како што видовме во past-- погоди Врати, а ние забележи дека, веднаш, GDB паузи и, повторно, нагласува следната линија. Не се забележи дека и сега, како резултат на нашата внесување на вредност, Имаме ажурирани таа вредност во внатрешноста на нашите локални променливи, кои е многу корисно да се знае точно она што тој број изнесувал во меморијата. Јас сега може да им овозможи на оваа програма да продолжат игра до крајот на неговото извршување Продолжи со притискање. Можеме да видиме дека многу брзо ја завршува програмата за извршување со истиот излез дека ние имале од порано, дебагерот затвора, а сега оваа програма го запре целосно. Јас покажуваат дека само за целите на гледање на она што се случува кога ние всушност хит надмине. Но, ние, всушност, се случува да се сакам да се вратам во оваа програма така што можеме да се обидеме да се debug токму она што се случува. Сега дека јас сум со користење на дебагерот, јас може да не треба овие debug printf извештаи. За да можам да ги отстрани како што јас ќе го направи сега само да се вратиме на нашата поедноставно код што ги имавме пред еден миг. Сега кога ќе се спаси програма и го изврши, тоа ќе се, повторно, се оди на таа првична брејк што морав на линијата 11. И Јас ќе бидам во можност да се испита моите променливи што сакам да го направам. Тоа само така се случува, дека овој дел не е многу интересно, И знам дека одам за печатење на оваа изјава. Ве молиме внесете број. А потоа, знам дека јас ќе одам да побара од корисникот за таа цел број. Па можеби, јас, всушност, сакаат да се движи мојот брејк малку потаму. Можете да ги отстраните брејк кликнувајќи, пак, директно од лево на тој број линија. Црвена точка која ќе исчезне, што укажува дека брејк сега исчезна. Сега, во овој случај, извршување е стопирана. И така тоа не е, всушност, ќе продолжи и во тој конкретен пример. Но, можам да го поставите на пауза укажуваат малку подоцна. И кога ќе се продолжи со мојот сега код, тоа ќе продолжи и да се каже поентата на тоа брејк. Повторно, јас хит надмине. Не изгледа како ништо не се случува. Но, тоа е затоа што мојот код е на чекање за влез. Јас ќе внесете број 5, притиснете ентер, и сега следниот брејк ќе бидат погодени. Сега, во овој случај, ова е на линија на кодот дека, пред, знаевме се случи да биде кабриолет. Значи, да се оцени она што се случува во оваа одредена точка во времето. Кога линијата е осветлен, овој линија се уште не е извршена. Значи во овој случај може да се види дека имам голем број, што Имам цел број наречен бр кој има вредност 5. А јас ќе одам да се вршат некои математика на тој број. Ако јас се повлече во текот тоа, можеме да известување дека вредноста за бр се промени во согласност со аритметичка дека ние сме всушност прави. И сега дека ние сме во внатрешноста на оваа за телефонска линија или сега дека за јамка самиот е осветлен, гледаме дека имаме нов променлива наречена ли дека се случува да се користи на таков за телефонска линија. Сега се сеќавам пред тоа јас напомена дека понекогаш си ќе видите некој вид на луд броеви како стандардно пред тој број, или таа променлива е всушност се иницијализира. Можеме да видиме дека токму тука во оваа променлива наречен i, што не е уште не е иницијализиран во време на осветлување. Но, можеме да видиме дека таа има неколку број дека нема да очекуваат. Во ред е. Не грижете се за тоа бидејќи не сме, всушност, иницијализиран тој број, се додека не го чекор во текот на оваа линија и вредноста I е иницијализиран на вредност 1. Па да се види дека тоа е всушност случај, ајде да се оддалечува. Сега можеме да видиме дека таа Линијата е погубен. И ние сме сега истакнување printf оваа линија. А сега можеме да видиме како нашите вредности на i и 3 се менуваат со текот на времето. Ова е многу корисно да се направи, всушност, е да се повлече во текот линии постојано. И можете да го најдете тоа што, всушност, се случува во внатрешноста на вашиот за јамка и што се случува со променливи внатре во тоа за телефонска линија како што на извршување на програмата се јавува еден чекор во исто време. Сега во овој момент, јас зачекори преку само доволно дека сега сум на крајот од мојата програма. Ако јас се повлече во текот тоа, тоа ќе всушност престане извршување како што видовме во минатото. Дозволете ми да го рестартирате овој, уште еднаш, па што можам да истакнеме уште нешто надвор, исто така. Во овој случај, тоа е сега да ме прашаат, повторно, за голем број, што Јас ќе се, повторно, да влезе. Но, овој пат, јас ќе одам да се влезе во поголем број, така што за телефонска линија ќе iterate повеќе пати. Во овој случај, јас ќе одам да внесете вредност од 11. Сега повторно, бидејќи јас ќе се постави брејк на линија 15, тоа се случува да се потенцира таа линија. Можеме да видиме дека нашата Бројот 11 е правилно застапени во нашите локални променливи. Повлекува во текот на овој, сега можеме види она што се случува со нашите вредноста на i како да продолжиме во внатрешноста на оваа за телефонска линија. Станува зголемува секој пат кога ние се достигне врвот на кои за телефонска линија. Сега една од работите кои би можеле да биде корисно да се направи за време на извршување на оваа програма е за мене да се, всушност, промена на талвег променливи за да ја видите Што се случува со мојата програма. Во овој случај, јас всушност може да двоен клик на вредност. Забележи дека станува поле за текст. Сега можам да влезат во различни цениме целосно да се види како мојата програма се однесува кога јас сум се промени таа променлива. Сега, во овој случај, на променлива Јас сега ја содржи вредноста 10. Но, на програмата се уште е пауза во извршување. Кога ќе се повлече во текот, гледам дека вредност i, што влегов како 10, не е поголема од вредноста на бр, кој веднаш предизвикува за телефонска линија да се запре извршувањето. Сега тоа не е само причина зошто би сакате да го измените на променливата во место. Ти всушност може да сакате да се обиде да го менувате, така дека може да продолжи извршување на јамка или така што ќе може да го менува некои вредност, пред да го достигне некои специфични сет на аритметички дека сте за да се исполни. Па сега дека ние всушност ја менува вредноста на i како на програмата беше извршување, тоа беше причина за телефонска линија да се откажат од прерано поради, одеднаш, јас се случи да биде поголема од вредноста на ЕЕЗ, што значи дека за јамка веќе не е потребно да се изврши. Понатаму, тоа се случи да биде на Ако не го сменивме вредноста на i кога линијата 17 Беше потенцирана која беше момент во времето дека за извршување јамка беше, всушност, се проценуваат. Ако имав промени на вредноста на Јас на разни нивоа, велат 19, ние би го виделе различни однесување, бидејќи линијата 19 би се егзекутирани пред јамка Состојбата беше преиспита. Сега во овој момент, јас сум, пак, на крајот на оваа програма. И јас можеме да дозволиме тоа да се продолжи со овозможи мојата програма да се откажат од природно. Но, има неколку работи кои се важни за да земе од овој особено дискусија. Треба да се оцени вашата претпоставки за тоа како го кодот треба да се однесуваат. Секое време мислите дека некои парче на кодот да знаете што се случува да се работи, кои би можеле да биде црвено знаме да се оди назад и да се оцени, и да бидат сигурни дека вашата претпоставка како тој код е што работат е всушност вистина за тоа како е изразени во вашиот изворен код. Но уште повеќе да поента беше, кога се користат дебагерот, може да се стави точка на прекин на различни линии на код, кои ќе предизвикаат дебагерот за да откажеш извршување на секоја од тие линии така што ќе може да се оцени меморија, па дури и да го промени во место. И повторно, не заборавајте дека можете да создаде повеќе точки на прекин, така што ќе исто така може да продолжи со извршување, прескокнете над поголем дел од кодот, и тој автоматски ќе се откажеш на следниот брејк. Има всушност повеќе напредни карактеристики на дебагерот, како и. Но, ние ќе мора да ви се однесуваат некои последователни видеа со цел да се навистина ги разграничат како да ги користат тие одредени функции. Сега за сега, ти благодарам многу за гледање. И со среќа дебагирање.