1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> DOUG LLOYD: Semua GDB betul. 3 00:00:06,830 --> 00:00:08,480 Apa yang betul-betul? 4 00:00:08,480 --> 00:00:11,310 Jadi GDB, yang berdiri untuk GNU Debugger, 5 00:00:11,310 --> 00:00:15,040 adalah alat yang benar-benar hebat yang boleh kita gunakan untuk membantu kami debug program kami, 6 00:00:15,040 --> 00:00:18,210 atau mengetahui di mana perkara-perkara yang yang salah dalam program-program kami. 7 00:00:18,210 --> 00:00:22,590 GDB adalah menakjubkan berkuasa, tetapi pengeluaran dan interaksi dengan ia 8 00:00:22,590 --> 00:00:23,830 boleh menjadi sedikit samar. 9 00:00:23,830 --> 00:00:28,210 Ia biasanya alat baris arahan, dan ia boleh membuang banyak mesej pada anda. 10 00:00:28,210 --> 00:00:31,144 Dan ia boleh jenis sukar untuk menghuraikan apa yang sedang berlaku. 11 00:00:31,144 --> 00:00:33,560 Langkah nasib baik, kami telah mengambil untuk menyelesaikan masalah ini untuk anda 12 00:00:33,560 --> 00:00:36,281 kerana anda bekerja melalui CS50. 13 00:00:36,281 --> 00:00:39,030 Jika anda tidak menggunakan grafik yang penyahpepijat, yang rakan sekerja saya Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse telah bercakap agak sedikit kira-kira dalam video yang 15 00:00:41,570 --> 00:00:44,740 perlu ke sini sekarang, anda mungkin perlu 16 00:00:44,740 --> 00:00:48,270 untuk menggunakan baris arahan alat untuk bekerja dengan GDB. 17 00:00:48,270 --> 00:00:51,250 Jika anda bekerja di CS50 IDE, anda tidak perlu untuk melakukan ini. 18 00:00:51,250 --> 00:00:53,550 Tetapi jika anda tidak bekerja di IDE CS50, 19 00:00:53,550 --> 00:00:55,750 mungkin menggunakan versi CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 atau yang lain Linux beroperasi sistem dengan GDB dipasang di atasnya, 21 00:00:58,860 --> 00:01:00,980 anda mungkin perlu menggunakan alat-alat baris arahan. 22 00:01:00,980 --> 00:01:02,860 >> Dan kerana anda mungkin perlu berbuat demikian, ia 23 00:01:02,860 --> 00:01:06,280 berguna hanya untuk memahami bagaimana GDB bekerja dari baris arahan. 24 00:01:06,280 --> 00:01:09,650 Tetapi sekali lagi, jika anda menggunakan IDE CS50, anda 25 00:01:09,650 --> 00:01:15,400 boleh menggunakan penyahpepijat grafik yang dibina ke dalam IDE. 26 00:01:15,400 --> 00:01:18,750 Jadi untuk mendapatkan perkara yang berlaku dengan GDB, untuk memulakan debugging 27 00:01:18,750 --> 00:01:21,220 proses tertentu program, semua yang anda perlu lakukan 28 00:01:21,220 --> 00:01:23,810 yang menaip GDB diikuti dengan nama program ini. 29 00:01:23,810 --> 00:01:28,620 Jadi, sebagai contoh, jika program anda adalah hello, anda akan menaip GDB hello. 30 00:01:28,620 --> 00:01:31,210 >> Apabila anda berbuat demikian, anda akan menarik persekitaran GDB itu. 31 00:01:31,210 --> 00:01:33,800 Segera anda akan berubah, dan bukannya apa yang ia biasanya 32 00:01:33,800 --> 00:01:35,841 adalah apabila anda menaip perkara di garis ini-- arahan ls, 33 00:01:35,841 --> 00:01:38,115 cd-- semua biasa anda Linux perintah, segera anda 34 00:01:38,115 --> 00:01:42,200 akan berubah kepada, mungkin, sesuatu seperti kurungan GDB kurungan. 35 00:01:42,200 --> 00:01:46,630 Itulah GDB segera baru anda, kerana anda berada di dalam persekitaran GDB itu. 36 00:01:46,630 --> 00:01:49,830 Apabila di dalam persekitaran itu, ada dua arahan utama 37 00:01:49,830 --> 00:01:52,290 bahawa anda mungkin akan menggunakan mengikut susunan yang berikut. 38 00:01:52,290 --> 00:01:55,200 >> Yang pertama adalah b, yang pendek untuk percutian. 39 00:01:55,200 --> 00:01:58,690 Dan selepas anda menaip b, anda biasanya taip nama fungsi, 40 00:01:58,690 --> 00:02:01,040 atau jika anda kebetulan tahu sekitar apa nombor talian 41 00:02:01,040 --> 00:02:04,100 program anda bermula berkelakuan sedikit pelik, 42 00:02:04,100 --> 00:02:06,370 anda boleh menaip garis beberapa di sana juga. 43 00:02:06,370 --> 00:02:09,660 Apa b, atau percutian, adakah adalah ia membolehkan program anda 44 00:02:09,660 --> 00:02:13,270 berjalan sehingga titik tertentu, iaitu nama fungsi 45 00:02:13,270 --> 00:02:15,880 yang anda nyatakan atau baris jumlah yang anda tentukan. 46 00:02:15,880 --> 00:02:18,590 >> Dan pada ketika itu, ia akan membekukan pelaksanaan. 47 00:02:18,590 --> 00:02:21,670 Ini adalah satu perkara yang benar-benar baik, kerana sekali pelaksanaan telah dibekukan, 48 00:02:21,670 --> 00:02:25,214 anda boleh mula dengan perlahan-lahan langkah melalui program anda. 49 00:02:25,214 --> 00:02:28,130 Biasanya, jika anda telah berjalan program anda, mereka cukup pendek. 50 00:02:28,130 --> 00:02:31,250 Biasanya, anda menaip slash dot apa sahaja nama program anda, tekan Enter, 51 00:02:31,250 --> 00:02:33,470 dan sebelum anda boleh berkelip, anda program sudah selesai. 52 00:02:33,470 --> 00:02:36,620 Ia tidak benar-benar banyak masa untuk mencuba dan memikirkan apa yang berlaku salah. 53 00:02:36,620 --> 00:02:40,920 Jadi ia dapat melambatkan perkara ke bawah dengan menetapkan titik pulang dengan b, 54 00:02:40,920 --> 00:02:43,040 dan kemudian melangkah masuk. 55 00:02:43,040 --> 00:02:46,169 >> Kemudian apabila anda telah menetapkan rehat anda titik, anda boleh menjalankan program ini. 56 00:02:46,169 --> 00:02:47,960 Dan jika anda mempunyai apa-apa hujah baris arahan, 57 00:02:47,960 --> 00:02:51,610 anda tentukan mereka di sini, tidak apabila anda menaip GDB nama program anda. 58 00:02:51,610 --> 00:02:55,980 Anda menetapkan semua baris arahan hujah-hujah dengan mengambil r, atau berjalan, 59 00:02:55,980 --> 00:03:00,270 dan kemudian hujah baris arahan apa sahaja penting di dalam program anda. 60 00:03:00,270 --> 00:03:03,510 Terdapat beberapa yang lain benar-benar arahan penting dan berguna 61 00:03:03,510 --> 00:03:04,970 dalam persekitaran KDNK. 62 00:03:04,970 --> 00:03:07,540 Jadi biarlah saya hanya cepat pergi ke beberapa daripada mereka. 63 00:03:07,540 --> 00:03:11,320 >> Yang pertama adalah n, yang pendek untuk akan datang, dan anda boleh menaip depan dan bukannya n, 64 00:03:11,320 --> 00:03:12,304 kedua-duanya akan bekerja. 65 00:03:12,304 --> 00:03:13,470 Dan ia hanya trengkas. 66 00:03:13,470 --> 00:03:17,540 Dan seperti yang anda mungkin telah mendapat digunakan untuk, dapat menaip perkara 67 00:03:17,540 --> 00:03:20,520 lebih pendek umumnya lebih baik. 68 00:03:20,520 --> 00:03:24,100 Dan apa yang ia akan lakukan ialah ia akan melangkah ke hadapan satu blok kod. 69 00:03:24,100 --> 00:03:26,170 Jadi ia akan bergerak ke hadapan sehingga panggilan fungsi. 70 00:03:26,170 --> 00:03:28,350 Dan ketika itu dan bukannya menyelam ke dalam fungsi yang 71 00:03:28,350 --> 00:03:33,130 dan melalui semua itu fungsi kod, ia hanya akan mempunyai fungsi. 72 00:03:33,130 --> 00:03:34,400 >> Majlis tersebut akan dipanggil. 73 00:03:34,400 --> 00:03:35,733 Ia akan melakukan apa sahaja yang tugasnya adalah. 74 00:03:35,733 --> 00:03:38,870 Ia akan mengembalikan nilai kepada fungsi yang memanggilnya. 75 00:03:38,870 --> 00:03:42,490 Dan kemudian anda akan bergerak ke garis seterusnya bahawa fungsi panggilan. 76 00:03:42,490 --> 00:03:44,555 Jika anda ingin melangkah di dalam majlis itu, 77 00:03:44,555 --> 00:03:46,430 bukan hanya mempunyai ia melaksanakan, terutama 78 00:03:46,430 --> 00:03:50,004 jika anda berfikir bahawa masalah ini mungkin terletak di dalam fungsi itu, 79 00:03:50,004 --> 00:03:52,670 anda boleh, sudah tentu, menetapkan rehat menunjukkan dalam fungsi itu. 80 00:03:52,670 --> 00:03:57,820 Atau jika anda sudah berjalan, anda boleh menggunakan s untuk melangkah ke hadapan satu baris kod. 81 00:03:57,820 --> 00:04:01,170 >> Jadi ini akan campur tangan dan menyelam ke dalam fungsi, 82 00:04:01,170 --> 00:04:04,750 bukan hanya mempunyai melaksanakan dan berterusan di dalam fungsi 83 00:04:04,750 --> 00:04:07,380 bahawa anda berada dalam untuk debugging. 84 00:04:07,380 --> 00:04:09,870 Jika anda pernah ingin tahu nilai pembolehubah, 85 00:04:09,870 --> 00:04:12,507 anda boleh menaip p, atau Print, dan kemudian nama berubah-ubah. 86 00:04:12,507 --> 00:04:15,090 Dan yang akan mencetak untuk anda, dalam persekitaran GDB itu, 87 00:04:15,090 --> 00:04:19,110 nama pembolehubah, yang atasmu, maafkan me-- nilai pembolehubah 88 00:04:19,110 --> 00:04:20,064 yang anda telah dinamakan. 89 00:04:20,064 --> 00:04:23,230 Jika anda ingin tahu nilai setiap pembolehubah tempatan boleh diakses dari mana 90 00:04:23,230 --> 00:04:25,970 anda kini berada di dalam anda program, anda boleh menaip maklumat penduduk tempatan. 91 00:04:25,970 --> 00:04:28,332 Ia lebih cepat daripada menaip p dan kemudian apa sahaja, 92 00:04:28,332 --> 00:04:30,540 menyenaraikan semua pembolehubah yang anda tahu wujud. 93 00:04:30,540 --> 00:04:34,370 Anda boleh menaip maklumat penduduk tempatan, dan ia akan mencetak segala-galanya untuk anda. 94 00:04:34,370 --> 00:04:37,770 Sehingga seterusnya ialah bt, yang pendek untuk Kembali Trace. 95 00:04:37,770 --> 00:04:41,680 Sekarang, secara amnya, terutamanya pada awal CS50, 96 00:04:41,680 --> 00:04:44,450 anda tidak akan benar-benar mempunyai kesempatan menggunakan bt, atau Balik Trace, 97 00:04:44,450 --> 00:04:47,860 kerana anda tidak mempunyai fungsi yang memanggil fungsi lain. 98 00:04:47,860 --> 00:04:50,450 >> Anda mungkin mempunyai panggilan utama yang fungsi, tetapi itu mungkin ia. 99 00:04:50,450 --> 00:04:53,199 Anda tidak mempunyai fungsi yang lain memanggil fungsi yang lain, yang 100 00:04:53,199 --> 00:04:54,880 memanggil fungsi yang lain, dan sebagainya. 101 00:04:54,880 --> 00:04:57,550 Tetapi sebagai program anda mendapatkan lebih banyak kompleks, dan terutamanya 102 00:04:57,550 --> 00:05:00,290 apabila anda mula bekerja dengan rekursi, jejak kembali 103 00:05:00,290 --> 00:05:05,150 boleh menjadi cara yang benar-benar berguna untuk membiarkan anda sejenis mendapatkan beberapa konteks di mana 104 00:05:05,150 --> 00:05:06,460 Saya dalam program saya. 105 00:05:06,460 --> 00:05:10,590 Jadi katakan anda telah menulis kod anda, dan anda tahu bahawa utama panggilan fungsi 106 00:05:10,590 --> 00:05:14,720 f, yang memerlukan satu majlis g, yang menyeru fungsi h. 107 00:05:14,720 --> 00:05:17,650 Oleh itu, kita mempunyai beberapa lapisan bersarang berlaku di sini. 108 00:05:17,650 --> 00:05:19,440 >> Jika anda berada di dalam persekitaran GDB anda, 109 00:05:19,440 --> 00:05:21,640 dan anda tahu dalam anda h, tetapi anda lupa 110 00:05:21,640 --> 00:05:27,210 tentang apa yang mendapat anda di mana anda ialah- anda boleh menaip bt, atau dapat dikesan kembali, 111 00:05:27,210 --> 00:05:32,370 dan ia akan mencetak h, g, f utama, bersama beberapa maklumat lain yang 112 00:05:32,370 --> 00:05:35,984 memberikan anda petunjuk itu, utama OK dipanggil f, f dipanggil g, g dipanggil h, 113 00:05:35,984 --> 00:05:37,900 dan itulah di mana saya kini sedang dalam program saya. 114 00:05:37,900 --> 00:05:41,380 Oleh itu, ia boleh benar-benar berguna, terutama kerana samar-ness di GDB 115 00:05:41,380 --> 00:05:45,667 menjadi sedikit hangat, untuk mengetahui dengan tepat di mana perkara-perkara yang. 116 00:05:45,667 --> 00:05:48,500 Akhir sekali, apabila program anda dilakukan, atau apabila anda selesai debugging ia 117 00:05:48,500 --> 00:05:50,125 dan anda mahu untuk melangkah jauh daripada persekitaran GDB itu, 118 00:05:50,125 --> 00:05:51,940 ia membantu untuk mengetahui bagaimana untuk keluar daripadanya. 119 00:05:51,940 --> 00:05:55,500 Anda boleh menaip q, atau Henti, untuk keluar. 120 00:05:55,500 --> 00:05:59,220 Sekarang, sebelum video hari ini Saya menyediakan program kereta 121 00:05:59,220 --> 00:06:03,900 dipanggil buggy1, yang saya menyusun dari fail yang dikenali sebagai buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Seperti yang anda jangkakan, ini program sebenarnya kereta. 123 00:06:06,500 --> 00:06:08,990 Ada masalah apabila saya cuba dan menjalankannya. 124 00:06:08,990 --> 00:06:13,014 Sekarang, malangnya, saya secara tidak sengaja dipadam fail buggy1.c saya, 125 00:06:13,014 --> 00:06:15,930 jadi untuk bagi saya untuk memikirkan apa yang berlaku salah dengan program ini, 126 00:06:15,930 --> 00:06:18,770 Saya akan perlu menggunakan GDB jenis membuta tuli, cuba 127 00:06:18,770 --> 00:06:22,372 untuk menavigasi melalui program ini kepada mengetahui dengan tepat apa yang berlaku salah. 128 00:06:22,372 --> 00:06:24,580 Tetapi dengan hanya menggunakan alat-alat kita telah belajar tentang, 129 00:06:24,580 --> 00:06:27,700 kita boleh angka cukup banyak mengetahui dengan tepat apa yang ada. 130 00:06:27,700 --> 00:06:30,740 Jadi mari kita menuju ke CS50 IDE dan lihat. 131 00:06:30,740 --> 00:06:33,155 OK, jadi kami di sini dalam saya CS50 persekitaran IDE, 132 00:06:33,155 --> 00:06:35,697 dan saya akan zum dalam sedikit supaya anda boleh melihat lebih sedikit. 133 00:06:35,697 --> 00:06:38,530 Dalam tetingkap terminal saya, jika saya senaraikan kandungan pengarah semasa saya 134 00:06:38,530 --> 00:06:41,250 dengan ls, kita akan melihat bahawa saya mempunyai beberapa fail sumber 135 00:06:41,250 --> 00:06:44,982 di sini, termasuk dibincangkan sebelum ini buggy1. 136 00:06:44,982 --> 00:06:46,940 Apa sebenarnya yang berlaku di ketika Saya cuba dan menjalankan buggy1. 137 00:06:46,940 --> 00:06:47,773 Nah mari kita mengetahui. 138 00:06:47,773 --> 00:06:52,510 Saya menaip slash dot, kereta, dan saya tekan Enter. 139 00:06:52,510 --> 00:06:53,670 >> Kesalahan segmentasi. 140 00:06:53,670 --> 00:06:55,000 Yang tidak baik. 141 00:06:55,000 --> 00:06:57,180 Jika anda masih ingat, satu segmentasi kesalahan biasanya 142 00:06:57,180 --> 00:07:01,540 berlaku apabila kita mengakses memori bahawa kita tidak dibenarkan untuk menyentuh. 143 00:07:01,540 --> 00:07:03,820 Kami telah entah bagaimana mencapai di luar batas-batas 144 00:07:03,820 --> 00:07:05,995 apa yang program ini, pengkompil, berikan kepada kita. 145 00:07:05,995 --> 00:07:08,310 Dan sebagainya sudah itu adalah satu petunjuk yang perlu toolbox 146 00:07:08,310 --> 00:07:10,660 seperti yang kita memulakan proses debugging. 147 00:07:10,660 --> 00:07:13,620 Sesuatu yang telah pergi yang salah sedikit di sini. 148 00:07:13,620 --> 00:07:15,935 >> Baiklah, jadi mari kita start persekitaran GDB yang 149 00:07:15,935 --> 00:07:19,030 dan lihat jika kita boleh memikirkan apa sebenarnya masalah sebenar. 150 00:07:19,030 --> 00:07:21,674 Saya akan mengosongkan skrin saya, dan saya akan menaip GDB 151 00:07:21,674 --> 00:07:24,340 sekali lagi, untuk memasuki persekitaran GDB itu, dan nama program 152 00:07:24,340 --> 00:07:27,450 yang saya mahu untuk debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Kami mendapat mesej sedikit, membaca karakter buggy1, dilakukan. 154 00:07:30,182 --> 00:07:32,390 Semua yang bermakna ia ditarik bersama-sama semua kod, 155 00:07:32,390 --> 00:07:35,570 dan kini ia telah dimuatkan ke dalam GDB, dan ia bersedia untuk pergi. 156 00:07:35,570 --> 00:07:37,140 >> Kini, apa yang saya mahu lakukan? 157 00:07:37,140 --> 00:07:39,130 Adakah anda masih ingat apa yang Langkah pertama biasanya adalah 158 00:07:39,130 --> 00:07:42,540 selepas saya di dalam alam ini? 159 00:07:42,540 --> 00:07:44,540 Mudah-mudahan, anda berkata ditetapkan titik rehat, kerana 160 00:07:44,540 --> 00:07:46,240 sebenarnya itulah yang saya mahu lakukan. 161 00:07:46,240 --> 00:07:47,990 Sekarang, saya tidak mempunyai Kod sumber untuk ini 162 00:07:47,990 --> 00:07:50,948 di depan saya, yang mungkin tidak kes penggunaan biasa, dengan cara itu. 163 00:07:50,948 --> 00:07:52,055 Anda mungkin akan. 164 00:07:52,055 --> 00:07:52,680 Jadi itulah yang baik. 165 00:07:52,680 --> 00:07:55,790 Tetapi dengan andaian anda tidak, apa yang fungsi salah satu yang anda tahu 166 00:07:55,790 --> 00:07:58,880 wujud dalam setiap program C tunggal? 167 00:07:58,880 --> 00:08:04,420 Tidak kira berapa besar atau berapa rumit ia adalah, fungsi ini pasti wujud. 168 00:08:04,420 --> 00:08:05,440 Utama, bukan? 169 00:08:05,440 --> 00:08:08,870 >> Jadi gagal segala-galanya, kita boleh menetapkan titik rehat di utama. 170 00:08:08,870 --> 00:08:12,200 Dan sekali lagi, saya hanya boleh menaip memecahkan utama, bukannya b. 171 00:08:12,200 --> 00:08:14,650 Dan jika anda ingin tahu, jika anda pernah menaip arahan yang panjang 172 00:08:14,650 --> 00:08:16,800 dan kemudian menyedari bahawa anda ditaip perkara yang salah, 173 00:08:16,800 --> 00:08:18,770 dan anda mahu untuk menghilangkan semua kerana saya hanya lakukan, 174 00:08:18,770 --> 00:08:22,029 anda boleh mengambil kawalan U, yang akan memadam segala-galanya dan membawa kamu kembali 175 00:08:22,029 --> 00:08:23,570 ke permulaan baris kursor. 176 00:08:23,570 --> 00:08:26,569 Banyak lebih cepat daripada hanya tahan memadam, atau memukul kali sekumpulan 177 00:08:26,569 --> 00:08:27,080 berakhir. 178 00:08:27,080 --> 00:08:28,740 >> Oleh itu, kita akan menetapkan titik rehat di utama. 179 00:08:28,740 --> 00:08:32,970 Dan seperti yang anda boleh lihat, ia mengatakan kami telah menetapkan titik pulang pada fail buggy1.c, 180 00:08:32,970 --> 00:08:36,330 dan nampaknya baris pertama daripada kod utama adalah garis tujuh. 181 00:08:36,330 --> 00:08:38,080 Sekali lagi, kita tidak mempunyai fail sumber itu di sini, 182 00:08:38,080 --> 00:08:40,429 tetapi saya akan menganggap bahawa itu memberitahu saya yang benar. 183 00:08:40,429 --> 00:08:44,510 Dan kemudian, saya hanya cuba dan menjalankan program, r. 184 00:08:44,510 --> 00:08:45,360 Program bermula. 185 00:08:45,360 --> 00:08:48,160 Baiklah, jadi pesanan ini adalah sedikit samar. 186 00:08:48,160 --> 00:08:50,160 Tetapi pada dasarnya apa yang berlaku di sini adalah ia hanya 187 00:08:50,160 --> 00:08:53,350 memberitahu saya yang saya melanda rehat saya titik, rehat titik nombor 1. 188 00:08:53,350 --> 00:08:55,877 >> Dan kemudian, yang baris kod, tiada fail atau direktori tersebut. 189 00:08:55,877 --> 00:08:57,710 Satu-satunya sebab yang Saya melihat mesej yang 190 00:08:57,710 --> 00:09:00,800 adalah kerana saya secara tidak sengaja dipadam fail buggy.c saya. 191 00:09:00,800 --> 00:09:04,050 Jika fail buggy1.c saya wujud dalam direktori semasa, 192 00:09:04,050 --> 00:09:06,920 hak garis ada akan sebenarnya beritahu saya apa baris kod 193 00:09:06,920 --> 00:09:08,214 literal berbunyi. 194 00:09:08,214 --> 00:09:09,380 Malangnya, saya memadamkannya. 195 00:09:09,380 --> 00:09:14,790 Kami akan perlu jenis mengemudi melalui ini sedikit lebih secara membuta tuli. 196 00:09:14,790 --> 00:09:17,330 >> OK, jadi mari kita lihat, apa yang yang saya mahu lakukan di sini? 197 00:09:17,330 --> 00:09:21,770 Well, saya ingin tahu apa tempatan pembolehubah mungkin disediakan untuk saya. 198 00:09:21,770 --> 00:09:23,570 Saya telah memulakan program saya. 199 00:09:23,570 --> 00:09:28,515 Mari kita lihat apa yang mungkin menjadi telah dimulakan untuk kita. 200 00:09:28,515 --> 00:09:31,430 Saya menaip penduduk tempatan Info, tiada penduduk tempatan. 201 00:09:31,430 --> 00:09:33,960 Baiklah, jadi yang tidak memberi saya satu tan maklumat. 202 00:09:33,960 --> 00:09:37,600 Saya boleh cuba dan mencetak pembolehubah, tetapi saya tidak tahu apa-apa nama yang berubah-ubah. 203 00:09:37,600 --> 00:09:39,930 Saya boleh cuba jejak kembali, tetapi saya dalam utama, 204 00:09:39,930 --> 00:09:43,710 jadi saya tahu saya tidak membuat satu lagi panggilan fungsi sekarang. 205 00:09:43,710 --> 00:09:47,710 >> Jadi kelihatan seperti pilihan sahaja saya adalah menggunakan n atau lebih dan mula menyelam. 206 00:09:47,710 --> 00:09:49,630 Saya akan menggunakan n. 207 00:09:49,630 --> 00:09:51,180 Jadi saya menaip n. 208 00:09:51,180 --> 00:09:53,060 Oh my gosh, apa yang berlaku di sini. 209 00:09:53,060 --> 00:09:56,260 Program menerima isyarat, SIGSEGV segmentasi kesalahan, 210 00:09:56,260 --> 00:09:57,880 dan kemudian sejumlah besar barangan. 211 00:09:57,880 --> 00:09:58,880 Saya sudah terharu. 212 00:09:58,880 --> 00:10:00,980 Nah, ada sebenarnya satu banyak yang boleh dipelajari di sini. 213 00:10:00,980 --> 00:10:02,520 Jadi, apa yang ini kepada kita? 214 00:10:02,520 --> 00:10:09,180 Apa yang ia memberitahu kita adalah, program ini adalah kira-kira, tetapi belum lagi, kesalahan seg. 215 00:10:09,180 --> 00:10:12,550 Dan khususnya, saya akan untuk mengezum masuk lebih jauh lagi di sini, 216 00:10:12,550 --> 00:10:18,980 ia adalah kira-kira untuk seg bersalah tentang sesuatu yang dinamakan strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Sekarang, kita mungkin tidak dibincangkan fungsi ini secara meluas. 218 00:10:22,705 --> 00:10:25,580 Tetapi ia is-- kerana kita tidak akan untuk bercakap tentang setiap fungsi yang 219 00:10:25,580 --> 00:10:28,610 wujud dalam standard C library-- tetapi mereka semua disediakan untuk anda, 220 00:10:28,610 --> 00:10:32,110 terutamanya jika anda mengambil melihat reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Dan strcmp adalah benar-benar kuat fungsi yang wujud di dalam 222 00:10:35,000 --> 00:10:38,070 pengepala string.h fail, yang boleh menanduk 223 00:10:38,070 --> 00:10:41,970 fail yang khusus untuk fungsi yang bekerja dengan dan memanipulasi tali. 224 00:10:41,970 --> 00:10:49,830 >> Dan khususnya, apa yang dilakukan adalah strcmp ia membandingkan nilai dua tali. 225 00:10:49,830 --> 00:10:54,160 Jadi saya kira-kira untuk segmentasi kesalahan dalam panggilan untuk strcmp ia seolah-olah. 226 00:10:54,160 --> 00:10:58,530 Saya memukul n, dan sebenarnya saya mendapat mesej, Program ditamatkan dengan isyarat SIGSEGV 227 00:10:58,530 --> 00:11:01,370 segmentasi bersalah. Jadi sekarang Saya sebenarnya telah seg disalahkan, 228 00:11:01,370 --> 00:11:06,479 dan program saya mempunyai cukup lebih berkesan berputus asa. 229 00:11:06,479 --> 00:11:07,770 Ini adalah akhir program. 230 00:11:07,770 --> 00:11:10,370 Ia rosak, ia terhempas. 231 00:11:10,370 --> 00:11:14,740 Jadi tidak banyak, tetapi saya sebenarnya tidak belajar agak sedikit 232 00:11:14,740 --> 00:11:16,747 daripada pengalaman ini sedikit. 233 00:11:16,747 --> 00:11:17,580 Apa yang telah saya pelajari? 234 00:11:17,580 --> 00:11:22,020 Nah, program saya crash cukup banyak dengan segera. 235 00:11:22,020 --> 00:11:26,300 Program saya kemalangan pada yang menyeru kepada strcmp, tetapi saya 236 00:11:26,300 --> 00:11:30,560 tidak mempunyai pembolehubah tempatan dalam saya program pada masa itu bahawa ia kemalangan. 237 00:11:30,560 --> 00:11:37,320 Jadi apa tali, atau tali, boleh saya mungkin menjadi membandingkan. 238 00:11:37,320 --> 00:11:42,140 Jika saya tidak mempunyai apa-apa tempatan pembolehubah, anda mungkin 239 00:11:42,140 --> 00:11:45,520 menduga bahawa saya ada-- mungkin ada ialah berubah-ubah global, yang boleh menjadi benar. 240 00:11:45,520 --> 00:11:47,670 >> Tetapi secara amnya, ia seolah-olah seperti saya membandingkan 241 00:11:47,670 --> 00:11:52,070 kepada sesuatu yang tidak wujud. 242 00:11:52,070 --> 00:11:54,130 Jadi mari kita menyiasat yang sedikit lagi. 243 00:11:54,130 --> 00:11:55,120 Jadi saya akan untuk mengosongkan skrin saya. 244 00:11:55,120 --> 00:11:57,536 Saya akan berhenti daripada Persekitaran GDB untuk kali kedua. 245 00:11:57,536 --> 00:12:01,300 Dan saya berfikir, OK, jadi tidak tidak pembolehubah tempatan dalam program saya. 246 00:12:01,300 --> 00:12:06,444 Saya tertanya-tanya jika mungkin saya sepatutnya lulus dalam rentetan sebagai hujah baris arahan. 247 00:12:06,444 --> 00:12:07,610 Jadi mari kita menguji ini keluar. 248 00:12:07,610 --> 00:12:09,020 Saya tidak melakukan ini sebelum ini. 249 00:12:09,020 --> 00:12:14,244 >> Mari kita lihat jika mungkin jika saya menjalankan program ini dengan hujah baris arahan ia berfungsi. 250 00:12:14,244 --> 00:12:16,140 Huh, tidak ada kesalahan segmentasi sana. 251 00:12:16,140 --> 00:12:17,870 Ia hanya memberitahu saya bahawa saya menganggap ia keluar. 252 00:12:17,870 --> 00:12:19,170 Jadi mungkin itu tetap di sini. 253 00:12:19,170 --> 00:12:27,560 Dan sesungguhnya, jika saya kembali dan melihat kod sumber sebenar untuk buggy1.c, 254 00:12:27,560 --> 00:12:31,180 nampaknya seperti apa yang saya lakukan adalah Saya membuat panggilan kepada strcmp tanpa 255 00:12:31,180 --> 00:12:34,010 memeriksa sama ada sebenarnya argv [1] wujud. 256 00:12:34,010 --> 00:12:36,730 Ini sebenarnya adalah Kod sumber untuk buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Jadi apa yang saya benar-benar perlu lakukan di sini untuk menetapkan program saya, 258 00:12:38,855 --> 00:12:40,835 menganggap saya mempunyai memfailkan di hadapan saya, 259 00:12:40,835 --> 00:12:44,740 hanya menambah cek untuk membuat memastikan argc yang sama dengan 2. 260 00:12:44,740 --> 00:12:47,780 Jadi contoh ini, sekali lagi, seperti saya katakan, adalah sedikit dibuat-buat, kan? 261 00:12:47,780 --> 00:12:49,840 Anda biasanya tidak akan tidak sengaja memadam kod sumber anda 262 00:12:49,840 --> 00:12:51,820 dan kemudian perlu cuba dan debug program ini. 263 00:12:51,820 --> 00:12:53,120 Tetapi mudah-mudahan, ia memberikan anda ilustrasi 264 00:12:53,120 --> 00:12:55,120 daripada jenis perkara-perkara yang anda boleh berfikir tentang 265 00:12:55,120 --> 00:12:56,610 seperti yang anda sedang debugging program anda. 266 00:12:56,610 --> 00:12:58,760 >> Apakah keadaan urusan di sini? 267 00:12:58,760 --> 00:13:00,510 Apakah pembolehubah saya mempunyai akses kepada saya? 268 00:13:00,510 --> 00:13:03,600 Di mana sebenarnya program saya terhempas, kepada apa line, 269 00:13:03,600 --> 00:13:05,240 kepada apa panggilan untuk apa fungsi? 270 00:13:05,240 --> 00:13:06,952 Apakah jenis petunjuk adakah itu memberi saya? 271 00:13:06,952 --> 00:13:08,910 Dan itulah yang jenis pemikiran yang 272 00:13:08,910 --> 00:13:12,820 perlu masuk ke apabila anda berada memikirkan debugging program anda. 273 00:13:12,820 --> 00:13:13,820 >> Saya Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Ini adalah CS50. 275 00:13:16,140 --> 00:15:08,642