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 Debugger, 5 00:00:11,310 --> 00:00:15,040 гэта сапраўды дзіўны інструмент, які мы можам выкарыстоўваць, каб дапамагчы нам адладкі нашых праграм, 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 IDE, вам не трэба рабіць гэта. 18 00:00:51,250 --> 00:00:53,550 Але калі вы не працуе ў CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 магчыма, з выкарыстаннем версіі з CS50 Appliance, 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 IDE, вы 25 00:01:09,650 --> 00:01:15,400 можна выкарыстоўваць графічны адладчык які пабудаваны ў IDE. 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 калі вы набіраеце рэчы У каманднай line-- Ls, 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 >> Па-першае, B, які кароткі для перапынку. 39 00:01:55,200 --> 00:01:58,690 І пасля таго, як Type B, як правіла, вы увядзіце імя функцыі, 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 Як правіла, пры ўводзе кропка слэш ўсе імя вашай праграмы, хіт Enter, 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 Вы паказваеце ўсё камандны радок Аргументы, прымаючы г, або бег, 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 >> Першы п, кароткі на наступны, і вы можаце ўвесці наступны замест п, 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 Ці, калі вы ўжо працуе, можна, выкарыстоўваць S да кроку наперад адну радок кода. 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 Гэта нашмат хутчэй, чым набраўшы р, а затым усё, што, 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 Далей ідзе BT, якая Карацей для зваротнай трасіроўкі. 95 00:04:37,770 --> 00:04:41,680 Цяпер, як правіла ,, асабліва ў пачатку CS50, 96 00:04:41,680 --> 00:04:44,450 вы не будзеце сапраўды мець выпадак выкарыстоўваць BT, або зваротнай трасіроўкі, 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-- вы можаце ўвесці BT, або зваротнай трасіроўкі, 111 00:05:27,210 --> 00:05:32,370 і гэта будзе раздрукаваць г, г, е галоўны, нароўні некаторай іншай інфармацыі, якая 112 00:05:32,370 --> 00:05:35,984 дае падказку, што, галоўным ОК называецца F, 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 Вы можаце ўвесці в або Выхад, каб выйсці. 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 IDE і паглядзіце. 131 00:06:30,740 --> 00:06:33,155 ОК, так што мы тут, у маім CS50 IDE сераду, 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 з Ls, мы ўбачым, што я ёсць пара зыходных файлаў 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 што я хачу, каб адладзіць, 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 існуе ў кожнай асобнай праграме C? 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 Вы можаце прыняць кіраванне U, які будзе выдаліць усе і вярнуцца назад 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 >> Так выглядае толькі мае варыянты выкарыстоўваць п або так і пачаць апускацца ў. 206 00:09:47,710 --> 00:09:49,630 Я збіраюся выкарыстоўваць п. 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 Што гэта кажа нам пра тое, гэтая праграма аб, але мае яшчэ няма, SEG віна. 215 00:10:09,180 --> 00:10:12,550 І ў прыватнасці, я збіраюся для павелічэння яшчэ далей тут, 216 00:10:12,550 --> 00:10:18,980 гэта збіраецца SEG няспраўнасць аб тое, што называецца зЬгстр. 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 І зЬгстр гэта сапраўды магутны функцыя, якая існуе ўнутры 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 >> І ў прыватнасці, тое, што робіць зЬгстр ён параўноўвае значэння двух радкоў. 225 00:10:49,830 --> 00:10:54,160 Так і я аб сегментацыі віну на заклік STRCMP здаецца. 226 00:10:54,160 --> 00:10:58,530 Я ўдарыў п, а на самай справе я атрымліваю паведамленне, Праграма завяршаецца з сігналам SIGSEGV 227 00:10:58,530 --> 00:11:01,370 Сегментацыя віна. Так што цяпер Я на самой справе SEG парушанымі, 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 праверкі, ці з'яўляецца ARGV [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 а затым паспрабаваць і адладзіць праграму. 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