1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> Даг LLOYD: Добро gdb. 3 00:00:06,830 --> 00:00:08,480 Што е тоа точно? 4 00:00:08,480 --> 00:00:11,310 Па GDB, која се залага за GNU Дебагерот, 5 00:00:11,310 --> 00:00:15,040 е навистина страшно алатка која може да се користите за да ни помогне да се debug нашите програми, 6 00:00:15,040 --> 00:00:18,210 или да дознаете каде што нештата се ќе е во ред во нашите програми. 7 00:00:18,210 --> 00:00:22,590 GDB е неверојатно моќен, но производството и интеракција со него 8 00:00:22,590 --> 00:00:23,830 може да биде малку криптичната. 9 00:00:23,830 --> 00:00:28,210 Тоа е обично алатка со командна линија, и тоа може да фрли многу пораки во вас. 10 00:00:28,210 --> 00:00:31,144 И тоа може да вид на тешко да анализирам токму она што се случува. 11 00:00:31,144 --> 00:00:33,560 За среќа, ние сме земени чекори да го надминете овој проблем за вас 12 00:00:33,560 --> 00:00:36,281 како што работат преку CS50. 13 00:00:36,281 --> 00:00:39,030 Ако не сте со користење на графичкиот дебагерот, што мојот колега Дан 14 00:00:39,030 --> 00:00:41,570 Armandarse зборува доста за малку за тоа во видео кое 15 00:00:41,570 --> 00:00:44,740 треба да биде овде во моментов, може да треба 16 00:00:44,740 --> 00:00:48,270 да ги користат овие за командната линија алатки за работа со gdb. 17 00:00:48,270 --> 00:00:51,250 Ако си работат во CS50 ИРО, вие не треба да се направи ова. 18 00:00:51,250 --> 00:00:53,550 Но, ако не сте работат во CS50 ИРО, 19 00:00:53,550 --> 00:00:55,750 можеби со помош на верзијата на CS50 апаратот, 20 00:00:55,750 --> 00:00:58,860 или друг Linux оперативниот систем со GDB инсталиран на него, 21 00:00:58,860 --> 00:01:00,980 можеби ќе треба да ги користат овие алатки за командната линија. 22 00:01:00,980 --> 00:01:02,860 >> И бидејќи можеби ќе мора да го направите тоа, тоа е 23 00:01:02,860 --> 00:01:06,280 корисно само за да се разбере како GDB работи од командната линија. 24 00:01:06,280 --> 00:01:09,650 Но, повторно, ако сте користење на CS50 ИРО, 25 00:01:09,650 --> 00:01:15,400 може да ги користите графичките дебагерот кој е изграден во ИРО. 26 00:01:15,400 --> 00:01:18,750 Така да се работи ќе со GDB, за да ја стартувате дебагирање 27 00:01:18,750 --> 00:01:21,220 процесот на одредена програма, се што треба да 28 00:01:21,220 --> 00:01:23,810 е тип GDB проследено со името на програмата. 29 00:01:23,810 --> 00:01:28,620 Така на пример, ако вашата програма е здраво, ќе напишеш GDB здраво. 30 00:01:28,620 --> 00:01:31,210 >> Кога ќе го направите тоа, ќе си оди да се повлече до средина gdb. 31 00:01:31,210 --> 00:01:33,800 Вашата линија ќе се промени, и наместо да бидат она што обично 32 00:01:33,800 --> 00:01:35,841 е кога ќе напишете работите на ls команда line--, 33 00:01:35,841 --> 00:01:38,115 cd-- сите од вашиот типичен Линукс команди, вашата линија 34 00:01:38,115 --> 00:01:42,200 ќе се смени, веројатно, нешто како загради GDB загради. 35 00:01:42,200 --> 00:01:46,630 Тоа е вашиот нов GDB брза, затоа што ти си во внатрешноста на животната средина gdb. 36 00:01:46,630 --> 00:01:49,830 Откако во внатрешноста на таа средина, има два големи команди 37 00:01:49,830 --> 00:01:52,290 кој најверојатно ќе се користи во следниов редослед. 38 00:01:52,290 --> 00:01:55,200 >> Првиот е б, кои е краток за пауза. 39 00:01:55,200 --> 00:01:58,690 И откако ќе ја напишете б, обично напишете името на некоја функција, 40 00:01:58,690 --> 00:02:01,040 или ако се случи да знаете околу она што линијата број 41 00:02:01,040 --> 00:02:04,100 Вашата програма ќе почне да се однесува малку чудно, 42 00:02:04,100 --> 00:02:06,370 можете да напишете линија број и таму. 43 00:02:06,370 --> 00:02:09,660 Што б или пауза, дали е тоа што им овозможува на вашата програма 44 00:02:09,660 --> 00:02:13,270 да се кандидира до една одредена точка, имено, на името на функцијата 45 00:02:13,270 --> 00:02:15,880 што ќе се определи или линијата број, кој сте го одредиле. 46 00:02:15,880 --> 00:02:18,590 >> И во тој момент тоа, ќе се замрзне извршување. 47 00:02:18,590 --> 00:02:21,670 Ова е навистина добра работа, бидејќи еднаш извршување е замрзнат, 48 00:02:21,670 --> 00:02:25,214 Можете да почнете да многу бавно чекор преку вашата програма. 49 00:02:25,214 --> 00:02:28,130 Обично, ако сте биле водење вашите програми, тие се прилично кратко. 50 00:02:28,130 --> 00:02:31,250 Обично, ќе напишете дот што и коса црта името на вашата програма, притиснете ентер, 51 00:02:31,250 --> 00:02:33,470 и пред да може да трепка, Вашиот Програмата е веќе завршена. 52 00:02:33,470 --> 00:02:36,620 Тоа не е навистина многу време за да се обиде и да дознаам што се случува во ред. 53 00:02:36,620 --> 00:02:40,920 Значи, тоа навистина да се биде во можност да го забават работите надолу со поставување брејк со б, 54 00:02:40,920 --> 00:02:43,040 а потоа се повлекува. 55 00:02:43,040 --> 00:02:46,169 >> Потоа, откако ќе го поставите вашиот одмор точка, можете да ја стартувате програмата. 56 00:02:46,169 --> 00:02:47,960 И ако имате било какви командната линија аргументи, 57 00:02:47,960 --> 00:02:51,610 ќе ги наведете тука, а не кога GDB го напишете вашето име програма. 58 00:02:51,610 --> 00:02:55,980 Ќе се определи сите командната линија аргументи, со преземање на R, или рок, 59 00:02:55,980 --> 00:03:00,270 а потоа било аргументи на командната линија ви треба во на вашата програма. 60 00:03:00,270 --> 00:03:03,510 Постојат голем број на други навистина важни и корисни команди 61 00:03:03,510 --> 00:03:04,970 внатрешноста на животната средина на БДП. 62 00:03:04,970 --> 00:03:07,540 Па ме пушти само брзо одиме во текот на некои од нив. 63 00:03:07,540 --> 00:03:11,320 >> Првиот е n, која е краток за следната, и можете да напишете следниот наместо n, 64 00:03:11,320 --> 00:03:12,304 и ќе работи. 65 00:03:12,304 --> 00:03:13,470 И тоа е само на стенографија. 66 00:03:13,470 --> 00:03:17,540 И како што сте веројатно веќе добиле користи за да се, да се биде во можност да напишеш работи 67 00:03:17,540 --> 00:03:20,520 пократок општо е подобра. 68 00:03:20,520 --> 00:03:24,100 А што тоа ќе го направи тоа ќе чекор напред еден блок од код. 69 00:03:24,100 --> 00:03:26,170 Па тоа ќе се оди напред до повик на функција. 70 00:03:26,170 --> 00:03:28,350 А потоа наместо нурнувајќи се во таа функција 71 00:03:28,350 --> 00:03:33,130 и да одите низ сето тоа функционира код, тоа само ќе имаат функција. 72 00:03:33,130 --> 00:03:34,400 >> Функција ќе бидат повикани. 73 00:03:34,400 --> 00:03:35,733 Тоа ќе го направи она што во неговата работа. 74 00:03:35,733 --> 00:03:38,870 Тоа ќе се врати на вредност за функцијата што го нарече. 75 00:03:38,870 --> 00:03:42,490 А потоа ќе се движи кон следната линија на тој повик функција. 76 00:03:42,490 --> 00:03:44,555 Ако сакате да се повлече во внатрешноста на функцијата, 77 00:03:44,555 --> 00:03:46,430 Наместо да има само го изврши, особено 78 00:03:46,430 --> 00:03:50,004 ако мислите дека проблемот може да лежи во внатрешноста на таа функција, 79 00:03:50,004 --> 00:03:52,670 Можете да, се разбира, во собата на пауза укажуваат внатрешноста на таа функција. 80 00:03:52,670 --> 00:03:57,820 Или ако сте веќе работат, можете да користат и да се чекор напред една линија код. 81 00:03:57,820 --> 00:04:01,170 >> Така што ова ќе чекор во и се нурне во функции, 82 00:04:01,170 --> 00:04:04,750 наместо само да имаат изврши и понатаму продолжуваат во функција 83 00:04:04,750 --> 00:04:07,380 дека ти си во за дебагирање. 84 00:04:07,380 --> 00:04:09,870 Ако некогаш сакате да ги знаете вредноста на променлива, 85 00:04:09,870 --> 00:04:12,507 можете да напишете р, или печатење, а потоа името на променливата. 86 00:04:12,507 --> 00:04:15,090 И дека ќе се печати на тебе, во внатрешноста на животната средина GDB, 87 00:04:15,090 --> 00:04:19,110 име на променлива, што you-- me-- изговор на вредноста на променливата 88 00:04:19,110 --> 00:04:20,064 дека сте именуван. 89 00:04:20,064 --> 00:04:23,230 Ако сакате да знаете што вредностите на секој локална променлива достапен од каде 90 00:04:23,230 --> 00:04:25,970 што во моментов се во вашата програма, можете да напишете инфо локалното население. 91 00:04:25,970 --> 00:04:28,332 Тоа е многу побрзо од пишување p и тогаш што и да, 92 00:04:28,332 --> 00:04:30,540 листата од сите на променливи што ќе знаат да постои. 93 00:04:30,540 --> 00:04:34,370 Можете да напишете инфо локалното население, и тоа ќе се печати сè за вас. 94 00:04:34,370 --> 00:04:37,770 Потоа е БТ, што е краток за назад трага. 95 00:04:37,770 --> 00:04:41,680 Сега, генерално, особено на почетокот CS50, 96 00:04:41,680 --> 00:04:44,450 Вие навистина не ќе имаат прилика да се користи БТ, или назад Рута, 97 00:04:44,450 --> 00:04:47,860 затоа што не си се има функции кои се нарекуваат други функции. 98 00:04:47,860 --> 00:04:50,450 >> Може да имаат главна повик функција, но тоа е веројатно тоа. 99 00:04:50,450 --> 00:04:53,199 Немате таа друга функција повикувајќи друга функција, која 100 00:04:53,199 --> 00:04:54,880 повикува друга функција, и така натаму. 101 00:04:54,880 --> 00:04:57,550 Но, како што вашите програми да добиете повеќе комплекс, а особено 102 00:04:57,550 --> 00:05:00,290 кога ќе почнат да работат со рекурзија, назад во трагови 103 00:05:00,290 --> 00:05:05,150 може да биде навистина корисен начин да ти дадам вид на се добијат некои контекст за каде 104 00:05:05,150 --> 00:05:06,460 Јас сум во мојата програма. 105 00:05:06,460 --> 00:05:10,590 Така да се каже што сте го напишале вашиот код, и знаете дека главен повикува функција 106 00:05:10,590 --> 00:05:14,720 ѓ, кој повикува на функција г, со што се доведува во функција ч. 107 00:05:14,720 --> 00:05:17,650 Па ние имаме повеќе слоеви на вгнездување случува тука. 108 00:05:17,650 --> 00:05:19,440 >> Ако сте во внатрешноста на Вашиот GDB средина, 109 00:05:19,440 --> 00:05:21,640 и знаеш вашиот внатрешноста на часот, но ја заборавите 110 00:05:21,640 --> 00:05:27,210 во врска со она што го добив на местото каде што are-- можете да напишете БТ, или назад во трагови, 111 00:05:27,210 --> 00:05:32,370 и тоа ќе се печати ч, г, ѓ главната, заедно со некои други информации, кои 112 00:05:32,370 --> 00:05:35,984 ви дава индикација дека, во ред главната наречен F, ѓ повика г, г наречен ч, 113 00:05:35,984 --> 00:05:37,900 и тоа е каде што Во моментов сум во мојата програма. 114 00:05:37,900 --> 00:05:41,380 Па тоа може да биде навистина корисно, особено како криптичната-Нес на GDB 115 00:05:41,380 --> 00:05:45,667 станува малку преголема, да дознаете точно каде работите се. 116 00:05:45,667 --> 00:05:48,500 Конечно, кога вашата програма е направено, или кога ќе завршиш тоа дебагирање 117 00:05:48,500 --> 00:05:50,125 и ако сакате да се чекор подалеку од околината GDB, 118 00:05:50,125 --> 00:05:51,940 тоа им помага да се знае како да се излезе од неа. 119 00:05:51,940 --> 00:05:55,500 Можете да напишете q, или да престанам, да излезат. 120 00:05:55,500 --> 00:05:59,220 Сега, пред денешната видео Јас изготви програма кабриолет 121 00:05:59,220 --> 00:06:03,900 наречен buggy1, за што јас состави од датотека познат како buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Како што може да се очекува, ова Програмата е во фактот кабриолет. 123 00:06:06,500 --> 00:06:08,990 Нешто тргне наопаку кога се обидувам и да ја стартувате. 124 00:06:08,990 --> 00:06:13,014 Сега, за жал, јас ненамерно избришан мојот buggy1.c датотека, 125 00:06:13,014 --> 00:06:15,930 па со цел за мене да дознаам она што се случува во ред со оваа програма, 126 00:06:15,930 --> 00:06:18,770 Јас сум ќе мора да се користи GDB вид на слепо, обидувајќи 127 00:06:18,770 --> 00:06:22,372 да се движите низ оваа програма да се дознаам што точно се случува во ред. 128 00:06:22,372 --> 00:06:24,580 Но само со користење на алатки ние веќе сте научиле за, 129 00:06:24,580 --> 00:06:27,700 можеме да доста фигура што точно е тоа. 130 00:06:27,700 --> 00:06:30,740 Па ајде да минете во текот на CS50 ИРО и да го погледне. 131 00:06:30,740 --> 00:06:33,155 Добро, така што ние сме тука во мојата CS50 ИРО животната средина, 132 00:06:33,155 --> 00:06:35,697 а јас ќе зумирате малку па можете да видите малку повеќе. 133 00:06:35,697 --> 00:06:38,530 Во мојот терминален прозорец, ако јас листата содржината на тековната ми директор 134 00:06:38,530 --> 00:06:41,250 со ЛС, ќе се види дека јас имаат неколку изворни датотеки 135 00:06:41,250 --> 00:06:44,982 тука, вклучувајќи го претходно дискутирано buggy1. 136 00:06:44,982 --> 00:06:46,940 Што точно се случува кога Се обидувам и да ја стартувате buggy1. 137 00:06:46,940 --> 00:06:47,773 Па ајде да дознаете. 138 00:06:47,773 --> 00:06:52,510 Јас тип точка коса црта, кабриолет, а јас притиснете Enter. 139 00:06:52,510 --> 00:06:53,670 >> Сегментација грешки. 140 00:06:53,670 --> 00:06:55,000 Тоа не е добро. 141 00:06:55,000 --> 00:06:57,180 Ако се сеќавате, на сегментација на вина обично 142 00:06:57,180 --> 00:07:01,540 се случува кога ние пристап меморија дека не ни е дозволено да се допре. 143 00:07:01,540 --> 00:07:03,820 Ние сме некако достигна до надвор од границите 144 00:07:03,820 --> 00:07:05,995 на она што на програмата, компајлер, ни ги даде. 145 00:07:05,995 --> 00:07:08,310 И така веќе тоа е поим за да се задржи во алатникот 146 00:07:08,310 --> 00:07:10,660 како што ние почнат процесот на дебагирање. 147 00:07:10,660 --> 00:07:13,620 Нешто тргна малку ред овде. 148 00:07:13,620 --> 00:07:15,935 >> Добро, па ајде да почнеме Регистрација на животната средина GDB 149 00:07:15,935 --> 00:07:19,030 и да видиме дали можеме да дознаам што точно е проблемот. 150 00:07:19,030 --> 00:07:21,674 Одам да го исчистите мојот екран, а јас ќе одам да напишеш GDB 151 00:07:21,674 --> 00:07:24,340 повторно, да се влезе во животната средина GDB, и името на програмата 152 00:07:24,340 --> 00:07:27,450 што сакам да debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Да добиеме малку порака, читање симболите од buggy1, направено. 154 00:07:30,182 --> 00:07:32,390 Сето тоа значи дека е се повлече заедно сите на кодот, 155 00:07:32,390 --> 00:07:35,570 а сега тоа е се вчита во GDB, и тој е подготвен да си замине. 156 00:07:35,570 --> 00:07:37,140 >> Сега, она што сакам да направам? 157 00:07:37,140 --> 00:07:39,130 Се сеќаваш ли на она што Првиот чекор обично е 158 00:07:39,130 --> 00:07:42,540 откако сум во внатрешноста на оваа средина? 159 00:07:42,540 --> 00:07:44,540 Се надевам, ти рече поставена брејк, бидејќи 160 00:07:44,540 --> 00:07:46,240 всушност, тоа е она што сакам да го направам. 161 00:07:46,240 --> 00:07:47,990 Сега, јас не имаат изворниот код за ова 162 00:07:47,990 --> 00:07:50,948 пред мене, што е веројатно не типичен случај употреба, од страна на патот. 163 00:07:50,948 --> 00:07:52,055 Вие веројатно нема. 164 00:07:52,055 --> 00:07:52,680 Па тоа е добро. 165 00:07:52,680 --> 00:07:55,790 Но под претпоставка дека не, што е онаа функција што го знаеш 166 00:07:55,790 --> 00:07:58,880 постои во секоја програма Ц? 167 00:07:58,880 --> 00:08:04,420 Без разлика колку големи или како комплицирано тоа е, оваа функција дефинитивно постои. 168 00:08:04,420 --> 00:08:05,440 Главната, нели? 169 00:08:05,440 --> 00:08:08,870 >> Така што не се друго, можеме да постави го направите точка пауза со главни. 170 00:08:08,870 --> 00:08:12,200 И повторно, јас само може да напишеш скрши главна, наместо б. 171 00:08:12,200 --> 00:08:14,650 И ако сте љубопитни, ако некогаш тип надвор долго команда 172 00:08:14,650 --> 00:08:16,800 а потоа сфати дека вие внесе нешто погрешно, 173 00:08:16,800 --> 00:08:18,770 а вие сакате да се ослободите на сите како што скоро сторив, 174 00:08:18,770 --> 00:08:22,029 можете да ја преземат контролата У, кој ќе избришете сè и донела 175 00:08:22,029 --> 00:08:23,570 до почетокот на курсорот линии. 176 00:08:23,570 --> 00:08:26,569 А многу побрзо отколку само држете го бришење или удирање тоа еден куп пати 177 00:08:26,569 --> 00:08:27,080 завршена. 178 00:08:27,080 --> 00:08:28,740 >> Па ние ќе се постави точка пауза со главни. 179 00:08:28,740 --> 00:08:32,970 И како што можете да видите, тоа вели дека ние сме постави го направите точка пауза со датотека buggy1.c, 180 00:08:32,970 --> 00:08:36,330 и, очигледно, на првата линија на кодот на главната линија е седум. 181 00:08:36,330 --> 00:08:38,080 Повторно, ние немаме изворната датотека тука, 182 00:08:38,080 --> 00:08:40,429 но јас ќе се претпостави дека тоа е ми ја кажува вистината. 183 00:08:40,429 --> 00:08:44,510 И тогаш, јас сум само се обидува и да ја стартувате програмата, р. 184 00:08:44,510 --> 00:08:45,360 Почнувајќи програма. 185 00:08:45,360 --> 00:08:48,160 Добро, па оваа порака е малку криптичната. 186 00:08:48,160 --> 00:08:50,160 Но во основа она што е случува овде е тоа е само 187 00:08:50,160 --> 00:08:53,350 ми велеше дека сум го погоди мојата пауза точка, брејк број 1. 188 00:08:53,350 --> 00:08:55,877 >> И тогаш, што линија код, Нема таква датотека или директориум. 189 00:08:55,877 --> 00:08:57,710 Единствената причина заради која Јас гледам дека пораката 190 00:08:57,710 --> 00:09:00,800 е затоа што ненамерно избришан мојот buggy.c датотека. 191 00:09:00,800 --> 00:09:04,050 Ако мојата buggy1.c датотека постоел во тековниот директориум, 192 00:09:04,050 --> 00:09:06,920 тоа право линија таму, всушност, би да ми кажете што линијата на кодот 193 00:09:06,920 --> 00:09:08,214 буквално гласи. 194 00:09:08,214 --> 00:09:09,380 За жал, јас тоа го бришат. 195 00:09:09,380 --> 00:09:14,790 Ние ќе треба да се има да се вид на движите преку овој малку повеќе слепо. 196 00:09:14,790 --> 00:09:17,330 >> Добро, па ајде да видиме, што сакам да се направи во оваа ситуација? 197 00:09:17,330 --> 00:09:21,770 Па, јас би сакал да знам што локалните променливи можеби се достапни за мене. 198 00:09:21,770 --> 00:09:23,570 Почнав мојата програма. 199 00:09:23,570 --> 00:09:28,515 Ајде да видиме што може да биде веќе иницијализиран за нас. 200 00:09:28,515 --> 00:09:31,430 Јас тип Информации за локалните жители, нема локални жители. 201 00:09:31,430 --> 00:09:33,960 Добро, така што не го прави тоа ми даде еден тон на информации. 202 00:09:33,960 --> 00:09:37,600 Можев да се обиде и да се печати една променлива, но јас не познавам ниеден променлива имиња. 203 00:09:37,600 --> 00:09:39,930 Јас може да се обидат назад трага, но јас сум во внатрешноста на главниот, 204 00:09:39,930 --> 00:09:43,710 па знам јас не го направија уште еден повик на функција во моментов. 205 00:09:43,710 --> 00:09:47,710 >> Па изгледа само моите опции се да се користи n или па и да почне да се избањаат. 206 00:09:47,710 --> 00:09:49,630 Одам да се користи n. 207 00:09:49,630 --> 00:09:51,180 Па јас тип n. 208 00:09:51,180 --> 00:09:53,060 Ох Боже, што се случува овде. 209 00:09:53,060 --> 00:09:56,260 Програма доби сигнали, Сегментација на вина SIGSEGV, 210 00:09:56,260 --> 00:09:57,880 а потоа и целиот куп на работи. 211 00:09:57,880 --> 00:09:58,880 Јас сум веќе совладан. 212 00:09:58,880 --> 00:10:00,980 Па, таму е всушност многу да се научи тука. 213 00:10:00,980 --> 00:10:02,520 Значи она што ни кажува ова? 214 00:10:02,520 --> 00:10:09,180 Што ни кажува што е, оваа програма е за да, но се уште не, СКГ вина. 215 00:10:09,180 --> 00:10:12,550 А особено, јас ќе одам за да зумирате и подалеку тука, 216 00:10:12,550 --> 00:10:18,980 тоа е за да СКГ вина за нешто што се нарекува strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Сега, ние не може да се дискутира оваа функција опширно. 218 00:10:22,705 --> 00:10:25,580 Но тоа is-- затоа што не си оди да се зборува за секоја функција што 219 00:10:25,580 --> 00:10:28,610 постои во стандарден C library-- но сите тие се на располагање на вас, 220 00:10:28,610 --> 00:10:32,110 особено ако се земе погледнете reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 И strcmp е навистина моќна функција што постои во 222 00:10:35,000 --> 00:10:38,070 на string.h глава датотека, која е со глава 223 00:10:38,070 --> 00:10:41,970 датотека која е посветена на функции кои работат со и да манипулира со жици. 224 00:10:41,970 --> 00:10:49,830 >> А особено, она што го прави е strcmp тоа се споредува вредностите на две жици. 225 00:10:49,830 --> 00:10:54,160 Значи јас сум за на сегментирање на вина на повик да strcmp што изгледа. 226 00:10:54,160 --> 00:10:58,530 Јас хит n, и всушност јас се добие порака, Програмата е прекината со сигналот SIGSEGV 227 00:10:58,530 --> 00:11:01,370 сегментација на вина. Па сега Јас всушност го обвини секунда, 228 00:11:01,370 --> 00:11:06,479 и мојата програма има доста многу ефикасно откажале. 229 00:11:06,479 --> 00:11:07,770 Ова е крај на програмата. 230 00:11:07,770 --> 00:11:10,370 Тоа се расипа, се урнал. 231 00:11:10,370 --> 00:11:14,740 Па не е многу, но јас всушност не научи доста 232 00:11:14,740 --> 00:11:16,747 од овој малку искуство. 233 00:11:16,747 --> 00:11:17,580 Што научив? 234 00:11:17,580 --> 00:11:22,020 Па, моето програма падне доста веднаш. 235 00:11:22,020 --> 00:11:26,300 Мојата програма се урна на на повик да strcmp, но јас 236 00:11:26,300 --> 00:11:30,560 немаат никакви локални променливи во мојата програмата на време дека ќе пропаднат. 237 00:11:30,560 --> 00:11:37,320 Значи она што низа, или жици, можев да се споредуваат. 238 00:11:37,320 --> 00:11:42,140 Ако јас не се имате било какви локални променливи, можеби ќе 239 00:11:42,140 --> 00:11:45,520 претпоставиме дека јас have-- таму можеби е глобалната променлива, што би можело да биде вистина. 240 00:11:45,520 --> 00:11:47,670 >> Но, генерално, се чини како да сум споредување 241 00:11:47,670 --> 00:11:52,070 до нешто што не постои. 242 00:11:52,070 --> 00:11:54,130 Значи, да се испита дека малку понатаму. 243 00:11:54,130 --> 00:11:55,120 Па јас ќе одам да се расчисти мојот екран. 244 00:11:55,120 --> 00:11:57,536 Одам да се откажат од GDB средина за една секунда. 245 00:11:57,536 --> 00:12:01,300 И јас сум размислување, во ред, па постои Нема локални променливи во мојата програма. 246 00:12:01,300 --> 00:12:06,444 Се прашувам дали можеби и јас сум би требало да помине во низа како аргументи на командната линија. 247 00:12:06,444 --> 00:12:07,610 Па да тестираат ова. 248 00:12:07,610 --> 00:12:09,020 Јас не го направиле тоа порано. 249 00:12:09,020 --> 00:12:14,244 >> Ајде да видиме дали можеби ако јас ја извршите оваа програма со аргументи на командната линија тоа функционира. 250 00:12:14,244 --> 00:12:16,140 Нели, не сегментација вина таму. 251 00:12:16,140 --> 00:12:17,870 Тоа само ми кажа дека сум го сфатиле. 252 00:12:17,870 --> 00:12:19,170 Па можеби тоа е фикс тука. 253 00:12:19,170 --> 00:12:27,560 И, навистина, ако се вратам и да се погледне во вистински извор код за buggy1.c, 254 00:12:27,560 --> 00:12:31,180 се чини како што правам е Јас сум правење на повик без да strcmp 255 00:12:31,180 --> 00:12:34,010 проверка дали всушност avg [1] постои. 256 00:12:34,010 --> 00:12:36,730 Ова е, всушност, изворниот код за buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Значи она што навистина треба да се направите тука за да го поправи мојата програма, 258 00:12:38,855 --> 00:12:40,835 претпоставувајќи имам поднесе пред мене, е 259 00:12:40,835 --> 00:12:44,740 само да го додадете чек да се направи дека argc е еднакво на 2. 260 00:12:44,740 --> 00:12:47,780 Така овој пример, повторно, како што реков, е малку измислена, нели? 261 00:12:47,780 --> 00:12:49,840 Обично не се случува да случајно избришете вашиот изворен код 262 00:12:49,840 --> 00:12:51,820 а потоа мора да се обиде и debug на програмата. 263 00:12:51,820 --> 00:12:53,120 Но се надевам, го даде ви илустрација 264 00:12:53,120 --> 00:12:55,120 на видовите на работи кои ќе може да се размислува за тоа 265 00:12:55,120 --> 00:12:56,610 како сте дебагирање на вашата програма. 266 00:12:56,610 --> 00:12:58,760 >> Што е состојбата на работите во оваа ситуација? 267 00:12:58,760 --> 00:13:00,510 Она што можам да направам променливи имаат достапни за мене? 268 00:13:00,510 --> 00:13:03,600 Каде што е мојата програма паѓа, на она линија, 269 00:13:03,600 --> 00:13:05,240 на она што повик за она што функција? 270 00:13:05,240 --> 00:13:06,952 Каков вид на индиции, дали тоа ми даде? 271 00:13:06,952 --> 00:13:08,910 И тоа е токму вид на начин на размислување дека ќе се 272 00:13:08,910 --> 00:13:12,820 треба да се навлегува во кога сте размислување за дебагирање вашите програми. 273 00:13:12,820 --> 00:13:13,820 >> Јас сум Даг Лојд. 274 00:13:13,820 --> 00:13:16,140 Ова е CS50. 275 00:13:16,140 --> 00:15:08,642