1 00:00:07,170 --> 00:00:12,630 [Powered by Google Translate] GDB, GNU Project Debugger, з'яўляецца магутным інструментам для адладкі C, 2 00:00:12,630 --> 00:00:14,300 разам з многімі іншымі мовамі. 3 00:00:14,300 --> 00:00:17,440 Яна дазваляе капацца ў вашых праграмах C, пакуль яны выконвацца, 4 00:00:17,440 --> 00:00:20,880 і гэта таксама дае вам магчымасць убачыць тое, што адбываецца 5 00:00:20,880 --> 00:00:22,490 Пры збоі праграмы. 6 00:00:22,490 --> 00:00:24,690 Гэта вельмі стыльны, правільна? 7 00:00:24,690 --> 00:00:27,980 GDB з'яўляецца свабодным праграмным забеспячэннем, і ён працуе на шматлікіх папулярных UNIX і 8 00:00:27,980 --> 00:00:31,840 Windows-заснаваных аперацыйных сістэм, так што гэта вельмі распаўсюджаны інструмент. 9 00:00:31,840 --> 00:00:33,560 >> Вы павінны навучыцца любіць гэта. 10 00:00:33,560 --> 00:00:36,800 GDB профі маюць значна лягчэй адсочвання памылак 11 00:00:36,800 --> 00:00:39,150 чым тыя, хто так-сяк выкарыстаннем здагадкі 12 00:00:39,150 --> 00:00:41,420 і бясконцая колькасць раздрукоўку заявы. 13 00:00:41,420 --> 00:00:45,810 GDB з'яўляецца ўтыліта каманднага радка, якая азначае, што вы можаце працаваць з ім у тэрмінале 14 00:00:45,810 --> 00:00:49,720 выдачы каманд з клавіятуры замест націску кнопкі з дапамогай мышы. 15 00:00:49,720 --> 00:00:54,960 >> Для запуску GDB, вы літаральна тыпу GDB у камандным радку і націсніце ўвод. 16 00:00:54,960 --> 00:00:58,230 Вы ўбачыце некалькі радкоў выводзіцца на экран 17 00:00:58,230 --> 00:01:00,810 паказваючы вам версію GDB, што вы працуеце, 18 00:01:00,810 --> 00:01:07,890 сваю інфармацыю аб аўтарскім праве, і ў канцы вы ўбачыце GDB радку: (GDB). 19 00:01:07,890 --> 00:01:10,770 Гэта дазваляе даведацца, што GDB гатовы для каманды. 20 00:01:10,770 --> 00:01:15,400 На дадзены момант, самая важная рэч, каб ведаць, як зрабіць, гэта кінуць паліць. 21 00:01:15,400 --> 00:01:17,790 На шчасце, гэта даволі проста. 22 00:01:17,790 --> 00:01:19,840 Кінуць каманда робіць менавіта гэта. 23 00:01:19,840 --> 00:01:23,090 У якасці цэтліка, вы можаце проста выкарыстоўваць д таксама. 24 00:01:23,090 --> 00:01:27,410 Як весела, як загружаецца GDB і тут жа выйсце ёсць, 25 00:01:27,410 --> 00:01:30,800 Давайце зараз пагаворым аб выкарыстанні GDB для адладкі праграм. 26 00:01:30,800 --> 00:01:34,630 >> Для пачатку, у мяне ёсць праграма, тут, у factorial.c 27 00:01:34,630 --> 00:01:37,380 , Які атрымлівае Int і спрабуе вылічыць яго факториал. 28 00:01:37,380 --> 00:01:41,270 У выпадку, калі вы яшчэ не бачылі факториалов да або не памятаеце іх, 29 00:01:41,270 --> 00:01:47,840 Факториал ліку п роўны твору п - (п - 1), (п - 2), і гэтак далей - 30 00:01:47,840 --> 00:01:49,230 пакуль вы не націснеце 1. 31 00:01:49,230 --> 00:01:54,550 Такім чынам, факториал 3, 3 * 2 * 1 або 6, 32 00:01:54,550 --> 00:02:00,180 і факториал 4, 4 * 3 * 2 * 1 або 24. 33 00:02:00,180 --> 00:02:03,970 Факториал нуля няцотная выпадку, гэта 1, 34 00:02:03,970 --> 00:02:06,970 і факториалов адмоўных лікаў не вызначаны. 35 00:02:06,970 --> 00:02:10,280 Ва ўсякім выпадку, нешта аб маім факториал праграма ў стылі фанк. 36 00:02:10,280 --> 00:02:15,410 Калі я запускаю яго, ён друкуе дзіўныя лічбы, якія не маюць нічога агульнага з факториалов. 37 00:02:15,410 --> 00:02:19,030 >> Такім чынам, мы можам выкарыстоўваць GDB, каб высветліць, што адбываецца. 38 00:02:19,030 --> 00:02:21,720 GDB працуе на выкананыя файлы, 39 00:02:21,720 --> 00:02:24,910 якія з'яўляюцца двайковыя файлы, створаныя працэс кампіляцыі. 40 00:02:24,910 --> 00:02:30,940 Гэта значыць, мы не можам запусціць GDB на нашу. Або з. Ч. файлаў зыходнага кода, як factorial.c. 41 00:02:30,940 --> 00:02:34,650 Мы хочам, каб запусціць яго на толькі што факториал замест гэтага. 42 00:02:34,650 --> 00:02:38,340 Калі праграма патрабуе ніякіх аргументаў каманднага радка, 43 00:02:38,340 --> 00:02:40,230 гэта дзе мы бы паказаць іх. 44 00:02:40,230 --> 00:02:44,050 У гэтым выпадку, фактарнага не патрабуе ніякіх аргументаў каманднага радка, 45 00:02:44,050 --> 00:02:46,410 так што мы проста увядзіце прабегу або R для сцісласці. 46 00:02:46,410 --> 00:02:50,440 >> Гэта прывядзе да запуску факториал запушчанай праграмы. 47 00:02:50,440 --> 00:02:53,940 Калі праграма спыняецца, я вазьму GDB падкажуць таму. 48 00:02:53,940 --> 00:02:58,130 Добра, давайце паспрабуем тое ж самае зноў, факториал 4. 49 00:02:58,130 --> 00:03:02,910 Добра, мы бачым, што мы атрымліваем такое ж барахло тут, у GDB. 50 00:03:02,910 --> 00:03:04,850 Цяпер, калі праграма завершыцца, 51 00:03:04,850 --> 00:03:06,870 мы не можам пайсці і атрымаць доступ да любога з яго стану, 52 00:03:06,870 --> 00:03:09,870 таму мы павінны пачаць гэта працуе зноў перш, чым мы можам бачыць, што адбываецца. 53 00:03:09,870 --> 00:03:13,570 Тым не менш, нам патрэбен спосаб, каб спыніць яго, пакуль ён знаходзіцца ў сярэдзіне свайго бегу. 54 00:03:13,570 --> 00:03:16,970 >> Для гэтага мы выкарыстоўваем тое, што называецца супыну. 55 00:03:16,970 --> 00:03:21,880 Breakpoints сказаць GDB для прыпынення праграмы ў той ці іншай функцыі або радкі зыходнага кода 56 00:03:21,880 --> 00:03:24,070 так што мы можам вывучыць стан праграмы, 57 00:03:24,070 --> 00:03:27,380 Значэнні зменных, стану памяці і такія, у гэтай кропцы. 58 00:03:27,380 --> 00:03:30,750 Так як я сапраўды не ведаю, дзе справы ідуць не так, 59 00:03:30,750 --> 00:03:33,510 >> Я проста хачу, каб пачаць адладку прама ў самым пачатку, 60 00:03:33,510 --> 00:03:36,510 правы, калі асноўнай пачынаецца. 61 00:03:36,510 --> 00:03:39,260 Мы будзем усталёўваць кропкі супыну ў пачатку галоўнага карыстання перапынку каманды. 62 00:03:39,260 --> 00:03:42,640 Мы таксама можам выкарыстоўваць б скарачаць разрыў. 63 00:03:42,640 --> 00:03:45,000 Зараз запусціце праграму зноў працуюць. 64 00:03:45,000 --> 00:03:48,140 Тут мы знаходзімся ў самым пачатку асноўнай, як GDB кажа нам. 65 00:03:48,140 --> 00:03:51,970 Радок кода, якая збіраецца выконваць, але яшчэ не 66 00:03:51,970 --> 00:03:53,480 з'яўляецца Printf лініі. 67 00:03:53,480 --> 00:03:57,200 Мы можам сказаць, GDB для выканання гэтай радкі кода і перайсці да наступнай радку 68 00:03:57,200 --> 00:03:59,840 з наступнай або п каманду. 69 00:03:59,840 --> 00:04:04,120 >> Добра, зараз GDB кажа нам, што мы знаходзімся на GetInt лініі. 70 00:04:04,120 --> 00:04:06,630 Я ведаю, што гэта паходзіць на Printf лініі не працаваць 71 00:04:06,630 --> 00:04:10,070 так як мы не бачым "Калі ласка, увядзіце станоўчае цэлы лік" раздрукаваць на экране, 72 00:04:10,070 --> 00:04:12,040 але гэта рэальна працаваць. 73 00:04:12,040 --> 00:04:16,029 Тое, што мы бачым, гэта аперацыйная сістэма падаўлення што-небудзь пісаць на экране 74 00:04:16,029 --> 00:04:19,649 пакуль ён абсалютна павінен, якія чаму адладкі з раздрукоўкамі 75 00:04:19,649 --> 00:04:21,730 часам можа здацца ненадзейнай. 76 00:04:21,730 --> 00:04:26,240 У любым выпадку, давайце зноў перайсці да наступнай радку кода і ўвядзіце ў Int. 77 00:04:26,240 --> 00:04:30,070 Зноў жа, давайце тыпу 4. 78 00:04:30,070 --> 00:04:34,540 Такім чынам, гэта выглядае дзіўна. Мы знаходзімся на лініі 12 у адпаведнасці з GDB, 79 00:04:34,540 --> 00:04:37,660 але ў наступным радку, што збіраецца выканаць гэта проста фігурнай дужкай. 80 00:04:37,660 --> 00:04:42,110 >> Гэта проста азначае, што мы знаходзімся ў канцы цыклу, у той час як нашы робяць пятлю на самай справе, 81 00:04:42,110 --> 00:04:46,710 і GDB кажа нам, што спыненне ўмова, а менавіта ні менш нуля, 82 00:04:46,710 --> 00:04:48,010 будзе выконвацца наступнай. 83 00:04:48,010 --> 00:04:50,230 Калі гэта калі-небудзь становіцца трохі заблытаным, 84 00:04:50,230 --> 00:04:54,860 мы можам падцягнуць зыходнага кода ў GDB са спісам або л каманды. 85 00:04:54,860 --> 00:04:56,880 Гэта выводзіць зыходны код 86 00:04:56,880 --> 00:04:59,010 які засяроджаны вакол лініі, што мы ў дадзены момант. 87 00:04:59,010 --> 00:05:03,590 Калі мы ўвядзем спіс або л зноў, мы ўбачым наступны набор ліній друку. 88 00:05:03,590 --> 00:05:06,070 Мы можам зрабіць гэта, пакуль мы не патрапілі ў канец файла. 89 00:05:06,070 --> 00:05:11,210 >> Каб вярнуцца туды, дзе мы былі, мы можам даць спіс з нумарам радка, 90 00:05:11,210 --> 00:05:14,120 У гэтым выпадку, радок 12. 91 00:05:14,120 --> 00:05:16,040 У любым выпадку, давайце рухацца далей. 92 00:05:16,040 --> 00:05:18,240 Цяпер мы на 4 завесы. 93 00:05:18,240 --> 00:05:21,490 Давайце пераканаемся, што наша зменная ўтрымоўвае лік 4. 94 00:05:21,490 --> 00:05:26,170 Мы робім гэта з дапамогай друку або P, каманда. 95 00:05:26,170 --> 00:05:31,140 Такім чынам, GDB кажа нам, што колькасць сапраўды захоўвання 4, як мы чакалі. 96 00:05:31,140 --> 00:05:35,180 $ 1, што GDB выводзіць з'яўляецца спецыяльнай зменнай GDB 97 00:05:35,180 --> 00:05:37,720 што цяпер усталяваны, каб захаваць нумар 4, а. 98 00:05:37,720 --> 00:05:42,240 Вы можаце ігнараваць гэта цяпер, але гэтыя зменныя GDB прыходзяць у супер зручная 99 00:05:42,240 --> 00:05:46,380 У больш запушчаных выпадках, калі вы хочаце ўспомніць, што вы рабілі ў мінулым. 100 00:05:46,380 --> 00:05:50,970 Ва ўсякім выпадку, перайсці з другога, мы бачым, што мы пачынаем рухацца праз цыкл. 101 00:05:50,970 --> 00:05:54,790 Давайце трымаць праходзіць тут з трохі п па частках. 102 00:05:54,790 --> 00:05:58,280 Замест таго, каб уводзіць п кожны раз, вы можаце проста націснуць ўвод. 103 00:05:58,280 --> 00:06:03,710 Калі вы націснеце увядзіце ня уводзячы нічога, GDB проста паўтарае папярэднюю каманду. 104 00:06:03,710 --> 00:06:05,910 Такім чынам, зараз мы трапілі ў Printf выкліку. 105 00:06:05,910 --> 00:06:09,520 Падобна на тое, мы сапраўды прайшлі праз наш цыкл 4 разы, 106 00:06:09,520 --> 00:06:13,750 якіх з'яўляецца тое, што мы хочам зрабіць для таго, каб памножыць на 1, 2, 3, і 4. 107 00:06:13,750 --> 00:06:15,870 >> Усё здаецца, што гэта працуе, 108 00:06:15,870 --> 00:06:19,680 выключэннем выпадкаў, калі мы трапілі наступны раз мы атрымліваем такое вялікая колькасць, а не 24. 109 00:06:19,680 --> 00:06:23,100 Калі раздрукаваць значэнне факториала з выкарыстаннем п, 110 00:06:23,100 --> 00:06:26,120 мы бачым, што факториал сапраўды ёсць гэта вялікая колькасць у ёй. 111 00:06:26,120 --> 00:06:28,740 Нешта вызначана не так. 112 00:06:28,740 --> 00:06:31,960 На дадзены момант, аднак, мы амаль у канцы праграмы, 113 00:06:31,960 --> 00:06:34,610 і гэта занадта позна, каб выправіць што-небудзь. 114 00:06:34,610 --> 00:06:39,750 >> Тым не менш, мы можам перазапусціць праграму, набраўшы г, а затым зноў у для пацверджання. 115 00:06:39,750 --> 00:06:43,460 Цяпер мы вярнуліся на нашу кропку супыну ў пачатку асноўнай. 116 00:06:43,460 --> 00:06:46,600 Мы ведаем, што ўсё быццам бы добра з чытаннем у п. 117 00:06:46,600 --> 00:06:48,630 так што мы можам забягаць наперад з п. 118 00:06:48,630 --> 00:06:52,280 Акрамя таго, мы можам усталяваць новую кропку пасля таго, як рабіць падчас цыклу 119 00:06:52,280 --> 00:06:54,910 і скакаць там. Давайце зробім гэта. 120 00:06:54,910 --> 00:06:59,080 Падобна на тое, лінія 14 ідзе адразу пасля цыклу. 121 00:06:59,080 --> 00:07:01,070 Давайце ўсталюем кропку супыну там. 122 00:07:01,070 --> 00:07:05,220 Гэта добрая практыка, каб паказаць імя файла ў гэтай камандзе супыну 123 00:07:05,220 --> 00:07:08,480 З GDB можа заблытацца, калі вы працуеце з некалькімі файламі. 124 00:07:08,480 --> 00:07:13,230 Каб рухацца наперад гэтай кропкі супыну, мы будзем выкарыстоўваць працягнуць або з камандай. 125 00:07:13,230 --> 00:07:16,570 >> Добра, тут мы знаходзімся ў цыкл. 126 00:07:16,570 --> 00:07:19,060 Давайце яшчэ 1 радок у цыкл, 127 00:07:19,060 --> 00:07:21,630 і тады мы пачнем друк зменных, каб убачыць, што адбываецца. 128 00:07:21,630 --> 00:07:26,410 Давайце пераканацца, што я сапраўды 1, як чакалася. 129 00:07:26,410 --> 00:07:28,300 Так, гэта ўсё добра. 130 00:07:28,300 --> 00:07:30,270 А факториал хоць? 131 00:07:30,270 --> 00:07:33,760 Гэй, гэта не добра. 132 00:07:33,760 --> 00:07:35,800 У нас ёсць вялікая адмоўнае лік тут. 133 00:07:35,800 --> 00:07:38,190 А адкуль гэта адбылося? 134 00:07:38,190 --> 00:07:40,040 Ну, калі мы азірнемся на код, 135 00:07:40,040 --> 00:07:44,800 Мы бачым, што мы ніколі не ініцыялізуецца, так што мы толькі што атрымалі смецця там. 136 00:07:44,800 --> 00:07:46,820 Гэта, безумоўна, скінуць нашы разлікі. 137 00:07:46,820 --> 00:07:49,930 >> На шчасце, мы не павінны пакідаць GDB, каб выправіць гэта. 138 00:07:49,930 --> 00:07:54,590 Мы можам ініцыялізаваць яе прама тут і замацаваць яго ў кодзе пазней, выкарыстоўваючы каманду друку. 139 00:07:54,590 --> 00:07:59,500 Мы будзем ініцыялізаваць яго ў 1, так як факториалов нуля і 1 роўныя 1, 140 00:07:59,500 --> 00:08:03,940 і калі мы ініцыялізаваць яго да нуля, то мы заўсёды ў канчатковым выніку з нуля, як наш вынік. 141 00:08:03,940 --> 00:08:08,370 Вы можаце ўсталяваць любы зменнай такім чынам, што гэта вельмі зручна. 142 00:08:08,370 --> 00:08:10,920 Цяпер, давайце працягнем нашу праграму. 143 00:08:10,920 --> 00:08:14,040 Давайце пераканацца, што ўсё гэта там, дзе гэта павінна быць. 144 00:08:14,040 --> 00:08:19,090 Num павінна быць 4, я павінен быць 1, і факториал павінна быць 1 таксама. 145 00:08:19,090 --> 00:08:23,990 Мы можаце скараціць гэты працэс і раздрукаваць ўсе нашы лакальныя зменныя 146 00:08:23,990 --> 00:08:26,440 з супер-карысным мясцовыя жыхары каманда інфармацыі, 147 00:08:26,440 --> 00:08:29,190 , Якая выводзіць ўсе нашы ў сферу лакальных зменных. 148 00:08:29,190 --> 00:08:31,980 Ва ўсякім выпадку, падобна, што ўсё добра ісці. 149 00:08:31,980 --> 00:08:34,700 >> Давайце зробім яшчэ адзін сыходзе на другі круг цыклу проста каб пераканацца. 150 00:08:34,700 --> 00:08:38,789 Добра, усё выглядае выдатна. 151 00:08:38,789 --> 00:08:41,659 Цяпер мы можам выкарыстоўваць працягваюцца каманду ісці да канца. 152 00:08:41,659 --> 00:08:46,170 Sweet! 4 факториал раздрукаваныя 24, як чакалася. 153 00:08:46,170 --> 00:08:48,690 Цяпер мы можам выправіць гэта ў наш код. 154 00:08:48,690 --> 00:08:53,710 Замест таго, каб выйсці з GDB, мы будзем выкарыстоўваць іншы тэрмінал ўкладку, каб зрабіць гэта. 155 00:08:53,710 --> 00:08:58,080 Вяртаючыся да нашага GDB ўкладкі, цяпер нам трэба перакампіляваць наш выкананы файл. 156 00:08:58,080 --> 00:09:03,180 Адна з лепшых рэчаў пра GDB з'яўляецца тое, што вам не трэба пакідаць GDB для запуску зрабіць. 157 00:09:03,180 --> 00:09:06,570 Так што мы не б'юць старых кропкі супыну, 158 00:09:06,570 --> 00:09:10,440 Давайце адключыць іх, як вы ўжо здагадаліся, адключыць каманду. 159 00:09:10,440 --> 00:09:13,320 Гэта прывядзе да адключэння ўсіх нашых кропак супыну. 160 00:09:13,320 --> 00:09:18,180 Цяпер мы можам перазапусціць праграму з т і пераканацца, што ўсё ў парадку. 161 00:09:18,180 --> 00:09:21,300 Падобна на тое, усё добра ісці. 162 00:09:21,300 --> 00:09:24,410 Факториал з 4 выводзіць 24, гэтак жа, як мы думалі. 163 00:09:24,410 --> 00:09:28,830 GDB з'яўляецца адным з самых карысных інструментаў, у вас ёсць у вашай панэлі інструментаў. 164 00:09:28,830 --> 00:09:31,970 >> Ёсць тоны больш рэчаў вы можаце зрабіць з GDB, 165 00:09:31,970 --> 00:09:34,030 значна больш, чым вы можаце зрабіць з простым раздрукоўкі. 166 00:09:34,030 --> 00:09:36,730 У наступны раз ваша праграма не робіць тое, што вы хочаце, 167 00:09:36,730 --> 00:09:39,740 паспрабуйце запусціць GDB, каб высветліць, што адбываецца ўнутры. 168 00:09:39,740 --> 00:09:44,380 З крыху практыкі, вы зможаце разгарнуць прама на памылку ў самыя кароткія тэрміны. 169 00:09:44,380 --> 00:09:48,180 Мяне клічуць Нейт Хардисон. Гэта CS50.