Даг Lloyd: Добра GDB. Што менавіта? Так, GDB, які стаіць для GNU Debugger, гэта сапраўды дзіўны інструмент, які мы можам выкарыстоўваць, каб дапамагчы нам адладкі нашых праграм, або даведацца, дзе рэчы адбываецца не так у нашых праграмах. GDB дзіўна магутны, але выхад і ўзаемадзеянне з ім можа быць трохі загадкавым. Гэта, як правіла, гэта інструмент каманднага радка, і ён можа кінуць шмат паведамленняў на вас. А можа гэта свайго роду цяжка разабраць, што менавіта адбываецца. На шчасце, мы распачалі крокі каб выправіць гэтую праблему для вас як вы працуеце праз CS50. Калі вы не выкарыстоўваеце графічны адладчык, які мой калега Дэн Armandarse казаў цалкам крыху пра ў відэа, павінна быць тут Прама зараз, вы, магчыма, спатрэбіцца выкарыстоўваць гэтыя камандны радок інструменты для працы з GDB. Калі вы працуеце ў CS50 IDE, вам не трэба рабіць гэта. Але калі вы не працуе ў CS50 IDE, магчыма, з выкарыстаннем версіі з CS50 Appliance, або эксплуатацыі іншая Linux Сістэма з GDB усталяваны на ім, Вы можаце трэба выкарыстоўваць гэтыя інструменты каманднага радка. І так як вы можаце трэба зрабіць гэта, гэта карысна проста каб зразумець, як GDB працуе з каманднага радка. Але, зноў жа, калі вы з дапамогай CS50 IDE, вы можна выкарыстоўваць графічны адладчык які пабудаваны ў IDE. Такім чынам, каб атрымаць рэчы, якія ідуць з GDB, каб пачаць адладку Працэс канкрэтны Праграма, усё, што вам трэба зрабіць, гэта ўвесці GDB з наступным па імя праграмы. Так, напрыклад, калі ваша праграма прывітанне, вы павінны ўвесці GDB прывітанне. Калі вы зробіце гэта, вы будзеце падцягнуць навакольнага асяроддзя GDB. Ваш запыт будзе змяніць, і замест таго, каб тое, што яго, як правіла, калі вы набіраеце рэчы У каманднай line-- Ls, cd-- усе ваш тыповы Лінукс каманд, ваш запыт зменіцца на, верагодна, нешта як дужках GDB дужкі. Гэта ваш новы хуткае GDB, таму што Вы знаходзіцеся ўнутры асяроддзя GDB. Пасля таго, як унутры гэтага асяроддзя, ёсць дзве асноўныя каманды што вы, верагодна, выкарыстоўваць у наступным парадку. Па-першае, B, які кароткі для перапынку. І пасля таго, як Type B, як правіла, вы увядзіце імя функцыі, або калі вы не ведаеце, вакол таго, што нумар радка Ваша праграма пачынае паводзіць сябе трохі дзіўным, Вы можаце ўвесці радок Колькасць там таксама. Што б, ці перапынак, робіць гэта дазваляе вашу праграму ня падбегчы да пэўнага моманту, а менавіта, імя функцыі што вы паказаць або лінія нумар, які вы пакажа. І ў той момант, гэта будзе замарозіць выкананне. Гэта сапраўды добрая рэч, таму што калі выкананне было замарожана, Вы можаце пачаць вельмі павольна пакрокава вашай праграме. Як правіла, калі вы былі працуе Вашы праграмы, яны даволі кароткія. Як правіла, пры ўводзе кропка слэш ўсе імя вашай праграмы, хіт Enter, і перш чым вы можаце міргаць, ваш Праграма ўжо гатовая. Гэта на самай справе не вельмі шмат часу, каб паспрабаваць і высветліць, што адбываецца не так. Так што на самай справе, каб быць у стане запаволіць рэчы ўніз, усталяваўшы кропку супыну з б, а затым ўмяшалася ў. Тады, як толькі вы ўсталюеце ваш адпачынак кропка, вы можаце запусціць праграму. І калі ў вас ёсць Аргументы каманднага радка, пазначыць іх тут, а не калі ўводзе GDB ваша імя праграмы. Вы паказваеце ўсё камандны радок Аргументы, прымаючы г, або бег, а затым аргументы каманднага радка ўсе Вы павінны ўнутры вашай праграмы. Ёсць шэраг іншых вельмі важныя і карысныя каманды ўнутры асяроддзя ВУП. Так дазвольце мне хутка перайсці некаторыя з іх. Першы п, кароткі на наступны, і вы можаце ўвесці наступны замест п, як будзе працаваць. І гэта толькі скарачэнне. І, як вы ўжо, напэўна, атрымалі раней, будучы ў стане набраць рэчы карацей, як правіла, лепш. І што ён будзе рабіць гэта буду крок наперад, адзін блок кода. Так што будзем рухацца наперад да выкліку функцыі. І тады замест таго, дайвінг ў гэтай функцыі і перажывае ўсе, што функцыі Код, ён проста будзе мець функцыю. Функцыя будзе называцца. Ён будзе рабіць тое, што яго праца. Гэта верне значэнне функцыя, якая называецца яго. І тады вы будзеце пераходзіць да Наступная радок гэтай выклікалай функцыі. Калі вы хочаце, каб крок ўнутры функцыі, а проста маючы гэта выканаць, асабліва калі вы думаеце, што праблема можа ляжаць ўнутры гэтай функцыі, Вы маглі б, вядома, усталяваць перапынак кропка ўнутры гэтай функцыі. Ці, калі вы ўжо працуе, можна, выкарыстоўваць S да кроку наперад адну радок кода. Так што гэта будзе крок у і ныраць у функцыі, а не проста мець выканаць і працягваючы ў функцыі што вы знаходзіцеся ў для адладкі. Калі вы калі-небудзь хацелі ведаць, значэнне зменнай, Вы можаце ўвесці р, або друк, а затым імя зменнай. І гэта будзе раздрукаваць для вас, ўнутры асяроддзя GDB, імя зменнай, што you-- прабачце me-- значэнне зменнай што вы назвалі. Калі вы хочаце ведаць значэння кожны лакальная пераменная даступная, адкуль Вы ў цяперашні час у вашай Праграма, вы можаце ўвесці Інфармацыя мясцовых жыхароў. Гэта нашмат хутчэй, чым набраўшы р, а затым усё, што, спіс з усіх з зменныя, якія вы ведаеце, існуюць. Вы можаце ўвесці Інфармацыя мясцовых жыхароў, і гэта выведзе усё для вас. Далей ідзе BT, якая Карацей для зваротнай трасіроўкі. Цяпер, як правіла ,, асабліва ў пачатку CS50, вы не будзеце сапраўды мець выпадак выкарыстоўваць BT, або зваротнай трасіроўкі, таму што вы, не маючы функцыі што выклікаць іншыя функцыі. Вы, магчыма, галоўны выкліку Функцыя, але гэта, верагодна, гэта. Вы не маюць, што іншыя функцыі выклік іншай функцыі, якая выклікае іншую функцыю, і гэтак далей. Але, як вашыя праграмы атрымаць больш Комплекс, у прыватнасці, калі вы пачынаеце працаваць з рэкурсіі, таму след можа быць сапраўды карысны спосаб, каб вы атрымаць від некаторы кантэкст для таго, дзе Я ў маёй праграме. Так, вы напісалі код, і Вы ведаеце, што асноўная выклікае функцыю е, што выклікае функцыю г, што выклікае функцыю гадзіну. Такім чынам, мы маем некалькі слаёў гнездавання тут адбываецца. Калі вы ўнутры серада, GDB і вы ведаеце, ваш ўнутры Н, але вы забыліся аб тым, што ёсць ты, дзе вы are-- вы можаце ўвесці BT, або зваротнай трасіроўкі, і гэта будзе раздрукаваць г, г, е галоўны, нароўні некаторай іншай інфармацыі, якая дае падказку, што, галоўным ОК называецца F, F называецца г, г называецца ч, і гэта, дзе я У цяперашні час знаходжуся ў маёй праграме. Так што можа быць вельмі карысна, асабліва загадкавым-Нес ў GDB становіцца трохі пераважнай, каб высветліць, дзе менавіта рэчы. Нарэшце, калі ваша праграма выконваецца, або калі вы скончыце яе адладкі і вы хочаце, каб адысці з навакольнага асяроддзя GDB, ён дапамагае даведацца, як выйсці з яго. Вы можаце ўвесці в або Выхад, каб выйсці. Зараз, перш чым сёння відэа Я падрыхтаваў праграму багі называецца buggy1, які я склаў з файла, вядомага як buggy1.c. Як вы маглі б чакаць, гэта Праграма на самай справе багі. Што-то ідзе не так калі я спрабую і запусціць яго. Зараз, на жаль, я неспадзявана выдалены buggy1.c файл, так для мяне, каб высветліць, што адбываецца не так з гэтай праграмай, Я збіраюся павінны выкарыстоўваць GDB выгляд ўсляпую, спрабуючы для навігацыі па гэтай праграме высветліць, што менавіта адбываецца не так. Але, выкарыстоўваючы толькі інструменты мы ўжо даведаліся аб, мы можам даволі шмат фігуру што менавіта яно і ёсць. Такім чынам, давайце над галавой CS50 IDE і паглядзіце. ОК, так што мы тут, у маім CS50 IDE сераду, і я буду павялічваць трохі так што вы можаце ўбачыць трохі больш. У маім акне тэрмінала, калі я пералічваю змесціва майго цяперашняга дырэктара з Ls, мы ўбачым, што я ёсць пара зыходных файлаў Тут, у тым ліку абмяркоўвалася раней buggy1. Што менавіта адбываецца, калі Я стараюся і запусціце buggy1. Ну, давайце высвятлім. Я тыпу кропка слэш, багі, і я ударыў Enter. Сегментаванне няспраўнасцяў. Гэта не добра. Калі вы Нагадаем, Сегментацыя віна, як правіла, адбываецца, калі мы атрымліваем доступ да памяці што мы не дазваляецца дакранацца. Мы неяк дабрацца па-за межамі што праграма, тым кампілятар, даў нам. І так ужо, што гэта ключ да трымаць у панэлі інструментаў мы пачынаем працэс адладкі. Нешта пайшло крыху няправільна тут. Добра, так што давайце пачнем да серады GDB і паглядзець, калі мы можам высветліць, што менавіта праблема. Я збіраюся ачысціць экран, і я збіраюся ўвесці GDB зноў, каб увайсці ў сераду GDB, і імя праграмы што я хачу, каб адладзіць, buggy1. Мы атрымліваем невялікае паведамленне, чытаючы , Зроблена сімвалы з buggy1. Усё гэта азначае, што ён выцягнуў гэта разам увесь код, і цяпер ён быў загружаны ў GDB, і ён гатовы да працы. Цяпер, што я хачу зрабіць? Памятаеш вам, што Першы крок, як правіла, з'яўляецца пасля я ўнутры гэтага асяроддзя? Спадзяюся, вы сказалі, усталяваць кропка разрыву, таму што у тым, што тое, што я хачу зрабіць. Зараз, я не маюць Зыходны код для гэтага перада мной, што, верагодна, ня тыповы выпадак выкарыстання, дарэчы. Вы, напэўна, будзе. Так што гэта добра. Але калі вы гэтага не зробіце, то, што адзін функцыя, што вы ведаеце існуе ў кожнай асобнай праграме C? Незалежна ад таго, наколькі вялікая ці наколькі складаным гэта, безумоўна, гэтая функцыя існуе. Галоўная, праўда? Так няўдачу за ўсё, мы можам ўсталяваць кропку супыну на галоўнай. І зноў, я б проста надрукаваць размовы Асноўнае, замест б. А калі вам цікава, калі вы альбо увядзіце доўгую каманду а затым ўсвядоміць, што вас набралі няправільную рэч, і вы хочаце, каб пазбавіцца за ўсё, як я толькі што зрабіў, Вы можаце прыняць кіраванне U, які будзе выдаліць усе і вярнуцца назад ў пачатку лініі курсора. Значна хутчэй, чым проста трымаць ўніз выдаляць ці наезд кучу раз больш. Такім чынам, мы ўсталявалі кропку супыну на галоўнай. І, як вы можаце бачыць, гэта кажа, што мы маю ўсталяваць кропку супыну на файл buggy1.c, і, мабыць, першая лінія з кода галоўнае, лінія сем. Зноў жа, мы не павінны зыходны файл тут, але я буду лічыць, што гэта кажа мне праўду. І потым, я проста спрабую і запусціць праграму, г. Пачынаючы праграму. Добра, так што гэта паведамленне трохі загадкавымі. Але ў асноўным тое, што што тут адбываецца, гэта проста кажа мне, што я ўдарыў перапынак Кропка, кропка разрыву нумар 1. А потым, што радок кода, няма такога файла ці каталога. Адзіная прычына, што Я бачу, што паведамленне таму, што я мімаволі выдалены buggy.c файл. Калі мой buggy1.c файл існуе у бягучым каталогу, што лінія тут фактычна скажы мне, што радок кода літаральна чытае. На жаль, я выдаліў яго. Мы збіраемся мець, каб перамяшчацца выгляд праз гэта крыху больш ўсляпую. Такім чынам, давайце паглядзім, што я хачу зрабіць тут? Ну, я хацеў бы ведаць, што мясцовы зменныя, можа быць, даступных мне. Я пачаў маю праграму. Давайце паглядзім, што можа быць ўжо ініцыялізаваны для нас. Я друкую інфармацыя мясцовых жыхароў, ні мясцовых жыхароў. Добра, так што не даць мне тоны інфармацыі. Я мог бы паспрабаваць і раздрукаваць зменную, але я не ведаю, якія імёны зменных. Я мог бы паспрабаваць назад след, але я ўнутры асноўнай, так што я ведаю, што не зрабіў іншы выклік прама зараз функцыя. Так выглядае толькі мае варыянты выкарыстоўваць п або так і пачаць апускацца ў. Я збіраюся выкарыстоўваць п. Так што я тыпу N. О, чорт вазьмі, што тут адбываецца. Праграма атрымала сігналы, SIGSEGV сегментацыя віна, а затым цэлая куча рэчаў. Я ўжо перагружаныя. Ну, на самай справе можна шмат чаму навучыцца тут. Такім чынам, што ж гэта нам кажа? Што гэта кажа нам пра тое, гэтая праграма аб, але мае яшчэ няма, SEG віна. І ў прыватнасці, я збіраюся для павелічэння яшчэ далей тут, гэта збіраецца SEG няспраўнасць аб тое, што называецца зЬгстр. Зараз, мы не можам абмеркавалі Гэтая функцыя шырока. Але гэта таму, што is-- мы не збіраемся казаць пра тое, што ўсе функцыі існуе ў стандарце C library-- але ўсе яны даступныя для вас, асабліва, калі вы бераце паглядзець на reference.cs50.net. І зЬгстр гэта сапраўды магутны функцыя, якая існуе ўнутры у загалоўку string.h Файл, які ўяўляе сабой загаловак файл, які прысвечаны функцый што праца з і маніпуляваць радкоў. І ў прыватнасці, тое, што робіць зЬгстр ён параўноўвае значэння двух радкоў. Так і я аб сегментацыі віну на заклік STRCMP здаецца. Я ўдарыў п, а на самай справе я атрымліваю паведамленне, Праграма завяршаецца з сігналам SIGSEGV Сегментацыя віна. Так што цяпер Я на самой справе SEG парушанымі, і мая праграма мае даволі шмат эфектыўна адмовілі. Гэта канец праграмы. Гэта зламаўся, ён разбіўся. Так што не было шмат, але я на самай справе даведацца зусім няшмат з гэтага мала вопыту. Што я даведаўся? Ну, мая праграма падае у значнай ступені неадкладна. Мая праграма не працуе на патэлефануеце каб STRCMP, але я не маюць ніякіх лакальных зменных у маім Праграма ў той час, ён падае. Так што радок або радкі, я мог бы параўноўваючы. Калі я не любая лакальная зменныя, вы можаце выказаць здагадку, што я, можа быць, have-- ёсць гэта глабальная зменная, якая можа быць праўдай. Але ў цэлым, здаецца, як я параўноўваю да чаго-тое, што не існуе. Так што давайце даследаваць што крыху далей. Так што я збіраюся ачысціць экран. Я збіраюся кінуць з шэрагу GDB сераду на секунду. І я думаў, добра, так што няма лакальныя зменныя ў маёй праграме. Цікава, калі магчыма, я павінен прайсці у радку ў якасці аргументу каманднага радка. Так што давайце проста праверыць гэта. Я не зрабіў гэтага раней. Давайце паглядзім, калі магчыма, калі я запускаю гэтую праграму з аргументам каманднага радка працуе. Так, няма памылкі сегментацыі там. Гэта проста сказаў мне, што я зразумеў гэта. Так, можа быць, гэта выпраўленне тут. І на самай справе, калі я іду назад і паглядзець на фактычны зыходны код для buggy1.c, здаецца, як быццам тое, што я раблю, Я раблю выклік STRCMP без праверкі, ці з'яўляецца ARGV [1] існуе на самай справе. Гэта на самай справе Зыходны код для buggy1.c. Так што я сапраўды трэба зрабіць тут, каб выправіць маю праграму, мяркуючы, у мяне ёсць падаць перада мной, з'яўляецца проста дадаць праверку, каб упэўнены, што ARGC роўна 2. Так што гэта прыклад, зноў жа, як я ўжо сказаў, трохі надуманы, праўда? Вы звычайна не збіраецца выпадкова выдаліць зыходны код а затым паспрабаваць і адладзіць праграму. Але, спадзяюся, гэта дало Вы ілюстрацыяй з тых рэчаў, што Вы маглі б думаць аб а вы адладкі праграмы. Што стан спраў тут? Якія зменныя Ці я ёсць даступным для мяне? Дзе менавіта мая праграма грукат, на якой лініі, на тое, што заклік да якой функцыі? Якія доказы ці дае гэта мне? І гэта менавіта выгляд мыслення, што вам павінны атрымліваць у калі вы думаць пра адладкі праграм. Я Дуг Лойд. Гэта CS50.