[Powered by Google Translate] GDB, GNU Project Debugger, з'яўляецца магутным інструментам для адладкі C,
разам з многімі іншымі мовамі.
Яна дазваляе капацца ў вашых праграмах C, пакуль яны выконвацца,
і гэта таксама дае вам магчымасць убачыць тое, што адбываецца
Пры збоі праграмы.
Гэта вельмі стыльны, правільна?
GDB з'яўляецца свабодным праграмным забеспячэннем, і ён працуе на шматлікіх папулярных UNIX і
Windows-заснаваных аперацыйных сістэм, так што гэта вельмі распаўсюджаны інструмент.
>> Вы павінны навучыцца любіць гэта.
GDB профі маюць значна лягчэй адсочвання памылак
чым тыя, хто так-сяк выкарыстаннем здагадкі
і бясконцая колькасць раздрукоўку заявы.
GDB з'яўляецца ўтыліта каманднага радка, якая азначае, што вы можаце працаваць з ім у тэрмінале
выдачы каманд з клавіятуры замест націску кнопкі з дапамогай мышы.
>> Для запуску GDB, вы літаральна тыпу GDB у камандным радку і націсніце ўвод.
Вы ўбачыце некалькі радкоў выводзіцца на экран
паказваючы вам версію GDB, што вы працуеце,
сваю інфармацыю аб аўтарскім праве, і ў канцы вы ўбачыце GDB радку: (GDB).
Гэта дазваляе даведацца, што GDB гатовы для каманды.
На дадзены момант, самая важная рэч, каб ведаць, як зрабіць, гэта кінуць паліць.
На шчасце, гэта даволі проста.
Кінуць каманда робіць менавіта гэта.
У якасці цэтліка, вы можаце проста выкарыстоўваць д таксама.
Як весела, як загружаецца GDB і тут жа выйсце ёсць,
Давайце зараз пагаворым аб выкарыстанні GDB для адладкі праграм.
>> Для пачатку, у мяне ёсць праграма, тут, у factorial.c
, Які атрымлівае Int і спрабуе вылічыць яго факториал.
У выпадку, калі вы яшчэ не бачылі факториалов да або не памятаеце іх,
Факториал ліку п роўны твору п - (п - 1), (п - 2), і гэтак далей -
пакуль вы не націснеце 1.
Такім чынам, факториал 3, 3 * 2 * 1 або 6,
і факториал 4, 4 * 3 * 2 * 1 або 24.
Факториал нуля няцотная выпадку, гэта 1,
і факториалов адмоўных лікаў не вызначаны.
Ва ўсякім выпадку, нешта аб маім факториал праграма ў стылі фанк.
Калі я запускаю яго, ён друкуе дзіўныя лічбы, якія не маюць нічога агульнага з факториалов.
>> Такім чынам, мы можам выкарыстоўваць GDB, каб высветліць, што адбываецца.
GDB працуе на выкананыя файлы,
якія з'яўляюцца двайковыя файлы, створаныя працэс кампіляцыі.
Гэта значыць, мы не можам запусціць GDB на нашу. Або з. Ч. файлаў зыходнага кода, як factorial.c.
Мы хочам, каб запусціць яго на толькі што факториал замест гэтага.
Калі праграма патрабуе ніякіх аргументаў каманднага радка,
гэта дзе мы бы паказаць іх.
У гэтым выпадку, фактарнага не патрабуе ніякіх аргументаў каманднага радка,
так што мы проста увядзіце прабегу або R для сцісласці.
>> Гэта прывядзе да запуску факториал запушчанай праграмы.
Калі праграма спыняецца, я вазьму GDB падкажуць таму.
Добра, давайце паспрабуем тое ж самае зноў, факториал 4.
Добра, мы бачым, што мы атрымліваем такое ж барахло тут, у GDB.
Цяпер, калі праграма завершыцца,
мы не можам пайсці і атрымаць доступ да любога з яго стану,
таму мы павінны пачаць гэта працуе зноў перш, чым мы можам бачыць, што адбываецца.
Тым не менш, нам патрэбен спосаб, каб спыніць яго, пакуль ён знаходзіцца ў сярэдзіне свайго бегу.
>> Для гэтага мы выкарыстоўваем тое, што называецца супыну.
Breakpoints сказаць GDB для прыпынення праграмы ў той ці іншай функцыі або радкі зыходнага кода
так што мы можам вывучыць стан праграмы,
Значэнні зменных, стану памяці і такія, у гэтай кропцы.
Так як я сапраўды не ведаю, дзе справы ідуць не так,
>> Я проста хачу, каб пачаць адладку прама ў самым пачатку,
правы, калі асноўнай пачынаецца.
Мы будзем усталёўваць кропкі супыну ў пачатку галоўнага карыстання перапынку каманды.
Мы таксама можам выкарыстоўваць б скарачаць разрыў.
Зараз запусціце праграму зноў працуюць.
Тут мы знаходзімся ў самым пачатку асноўнай, як GDB кажа нам.
Радок кода, якая збіраецца выконваць, але яшчэ не
з'яўляецца Printf лініі.
Мы можам сказаць, GDB для выканання гэтай радкі кода і перайсці да наступнай радку
з наступнай або п каманду.
>> Добра, зараз GDB кажа нам, што мы знаходзімся на GetInt лініі.
Я ведаю, што гэта паходзіць на Printf лініі не працаваць
так як мы не бачым "Калі ласка, увядзіце станоўчае цэлы лік" раздрукаваць на экране,
але гэта рэальна працаваць.
Тое, што мы бачым, гэта аперацыйная сістэма падаўлення што-небудзь пісаць на экране
пакуль ён абсалютна павінен, якія чаму адладкі з раздрукоўкамі
часам можа здацца ненадзейнай.
У любым выпадку, давайце зноў перайсці да наступнай радку кода і ўвядзіце ў Int.
Зноў жа, давайце тыпу 4.
Такім чынам, гэта выглядае дзіўна. Мы знаходзімся на лініі 12 у адпаведнасці з GDB,
але ў наступным радку, што збіраецца выканаць гэта проста фігурнай дужкай.
>> Гэта проста азначае, што мы знаходзімся ў канцы цыклу, у той час як нашы робяць пятлю на самай справе,
і GDB кажа нам, што спыненне ўмова, а менавіта ні менш нуля,
будзе выконвацца наступнай.
Калі гэта калі-небудзь становіцца трохі заблытаным,
мы можам падцягнуць зыходнага кода ў GDB са спісам або л каманды.
Гэта выводзіць зыходны код
які засяроджаны вакол лініі, што мы ў дадзены момант.
Калі мы ўвядзем спіс або л зноў, мы ўбачым наступны набор ліній друку.
Мы можам зрабіць гэта, пакуль мы не патрапілі ў канец файла.
>> Каб вярнуцца туды, дзе мы былі, мы можам даць спіс з нумарам радка,
У гэтым выпадку, радок 12.
У любым выпадку, давайце рухацца далей.
Цяпер мы на 4 завесы.
Давайце пераканаемся, што наша зменная ўтрымоўвае лік 4.
Мы робім гэта з дапамогай друку або P, каманда.
Такім чынам, GDB кажа нам, што колькасць сапраўды захоўвання 4, як мы чакалі.
$ 1, што GDB выводзіць з'яўляецца спецыяльнай зменнай GDB
што цяпер усталяваны, каб захаваць нумар 4, а.
Вы можаце ігнараваць гэта цяпер, але гэтыя зменныя GDB прыходзяць у супер зручная
У больш запушчаных выпадках, калі вы хочаце ўспомніць, што вы рабілі ў мінулым.
Ва ўсякім выпадку, перайсці з другога, мы бачым, што мы пачынаем рухацца праз цыкл.
Давайце трымаць праходзіць тут з трохі п па частках.
Замест таго, каб уводзіць п кожны раз, вы можаце проста націснуць ўвод.
Калі вы націснеце увядзіце ня уводзячы нічога, GDB проста паўтарае папярэднюю каманду.
Такім чынам, зараз мы трапілі ў Printf выкліку.
Падобна на тое, мы сапраўды прайшлі праз наш цыкл 4 разы,
якіх з'яўляецца тое, што мы хочам зрабіць для таго, каб памножыць на 1, 2, 3, і 4.
>> Усё здаецца, што гэта працуе,
выключэннем выпадкаў, калі мы трапілі наступны раз мы атрымліваем такое вялікая колькасць, а не 24.
Калі раздрукаваць значэнне факториала з выкарыстаннем п,
мы бачым, што факториал сапраўды ёсць гэта вялікая колькасць у ёй.
Нешта вызначана не так.
На дадзены момант, аднак, мы амаль у канцы праграмы,
і гэта занадта позна, каб выправіць што-небудзь.
>> Тым не менш, мы можам перазапусціць праграму, набраўшы г, а затым зноў у для пацверджання.
Цяпер мы вярнуліся на нашу кропку супыну ў пачатку асноўнай.
Мы ведаем, што ўсё быццам бы добра з чытаннем у п.
так што мы можам забягаць наперад з п.
Акрамя таго, мы можам усталяваць новую кропку пасля таго, як рабіць падчас цыклу
і скакаць там. Давайце зробім гэта.
Падобна на тое, лінія 14 ідзе адразу пасля цыклу.
Давайце ўсталюем кропку супыну там.
Гэта добрая практыка, каб паказаць імя файла ў гэтай камандзе супыну
З GDB можа заблытацца, калі вы працуеце з некалькімі файламі.
Каб рухацца наперад гэтай кропкі супыну, мы будзем выкарыстоўваць працягнуць або з камандай.
>> Добра, тут мы знаходзімся ў цыкл.
Давайце яшчэ 1 радок у цыкл,
і тады мы пачнем друк зменных, каб убачыць, што адбываецца.
Давайце пераканацца, што я сапраўды 1, як чакалася.
Так, гэта ўсё добра.
А факториал хоць?
Гэй, гэта не добра.
У нас ёсць вялікая адмоўнае лік тут.
А адкуль гэта адбылося?
Ну, калі мы азірнемся на код,
Мы бачым, што мы ніколі не ініцыялізуецца, так што мы толькі што атрымалі смецця там.
Гэта, безумоўна, скінуць нашы разлікі.
>> На шчасце, мы не павінны пакідаць GDB, каб выправіць гэта.
Мы можам ініцыялізаваць яе прама тут і замацаваць яго ў кодзе пазней, выкарыстоўваючы каманду друку.
Мы будзем ініцыялізаваць яго ў 1, так як факториалов нуля і 1 роўныя 1,
і калі мы ініцыялізаваць яго да нуля, то мы заўсёды ў канчатковым выніку з нуля, як наш вынік.
Вы можаце ўсталяваць любы зменнай такім чынам, што гэта вельмі зручна.
Цяпер, давайце працягнем нашу праграму.
Давайце пераканацца, што ўсё гэта там, дзе гэта павінна быць.
Num павінна быць 4, я павінен быць 1, і факториал павінна быць 1 таксама.
Мы можаце скараціць гэты працэс і раздрукаваць ўсе нашы лакальныя зменныя
з супер-карысным мясцовыя жыхары каманда інфармацыі,
, Якая выводзіць ўсе нашы ў сферу лакальных зменных.
Ва ўсякім выпадку, падобна, што ўсё добра ісці.
>> Давайце зробім яшчэ адзін сыходзе на другі круг цыклу проста каб пераканацца.
Добра, усё выглядае выдатна.
Цяпер мы можам выкарыстоўваць працягваюцца каманду ісці да канца.
Sweet! 4 факториал раздрукаваныя 24, як чакалася.
Цяпер мы можам выправіць гэта ў наш код.
Замест таго, каб выйсці з GDB, мы будзем выкарыстоўваць іншы тэрмінал ўкладку, каб зрабіць гэта.
Вяртаючыся да нашага GDB ўкладкі, цяпер нам трэба перакампіляваць наш выкананы файл.
Адна з лепшых рэчаў пра GDB з'яўляецца тое, што вам не трэба пакідаць GDB для запуску зрабіць.
Так што мы не б'юць старых кропкі супыну,
Давайце адключыць іх, як вы ўжо здагадаліся, адключыць каманду.
Гэта прывядзе да адключэння ўсіх нашых кропак супыну.
Цяпер мы можам перазапусціць праграму з т і пераканацца, што ўсё ў парадку.
Падобна на тое, усё добра ісці.
Факториал з 4 выводзіць 24, гэтак жа, як мы думалі.
GDB з'яўляецца адным з самых карысных інструментаў, у вас ёсць у вашай панэлі інструментаў.
>> Ёсць тоны больш рэчаў вы можаце зрабіць з GDB,
значна больш, чым вы можаце зрабіць з простым раздрукоўкі.
У наступны раз ваша праграма не робіць тое, што вы хочаце,
паспрабуйце запусціць GDB, каб высветліць, што адбываецца ўнутры.
З крыху практыкі, вы зможаце разгарнуць прама на памылку ў самыя кароткія тэрміны.
Мяне клічуць Нейт Хардисон. Гэта CS50.