1 00:00:00,000 --> 00:00:05,640 2 00:00:05,640 --> 00:00:06,830 >> Doug LLOYD: Baiklah GDB. 3 00:00:06,830 --> 00:00:08,480 Apa itu sebenarnya? 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 sangat mengagumkan bahwa kita bisa gunakan untuk membantu kami men-debug program kami, 6 00:00:15,040 --> 00:00:18,210 atau mencari tahu di mana hal-hal yang akan salah dalam program kami. 7 00:00:18,210 --> 00:00:22,590 GDB adalah luar biasa kuat, tapi output dan interaksi dengan itu 8 00:00:22,590 --> 00:00:23,830 dapat menjadi sedikit samar. 9 00:00:23,830 --> 00:00:28,210 Ini biasanya alat baris perintah, dan dapat membuang banyak pesan pada Anda. 10 00:00:28,210 --> 00:00:31,144 Dan itu bisa agak sulit untuk mengurai persis apa yang terjadi. 11 00:00:31,144 --> 00:00:33,560 Langkah Untungnya, kami sudah untuk memperbaiki masalah ini untuk Anda 12 00:00:33,560 --> 00:00:36,281 saat Anda bekerja melalui CS50. 13 00:00:36,281 --> 00:00:39,030 Jika Anda tidak menggunakan grafis yang debugger, yang rekan saya Dan 14 00:00:39,030 --> 00:00:41,570 Armandarse telah berbicara cukup sedikit tentang dalam video yang 15 00:00:41,570 --> 00:00:44,740 harus di sini sekarang, Anda mungkin perlu 16 00:00:44,740 --> 00:00:48,270 menggunakan baris perintah ini alat untuk bekerja dengan GDB. 17 00:00:48,270 --> 00:00:51,250 Jika Anda bekerja di CS50 IDE, Anda tidak perlu melakukan hal ini. 18 00:00:51,250 --> 00:00:53,550 Tapi jika Anda tidak bekerja di CS50 IDE, 19 00:00:53,550 --> 00:00:55,750 mungkin menggunakan versi dari CS50 Appliance, 20 00:00:55,750 --> 00:00:58,860 atau operasi Linux lain sistem dengan GDB diinstal di atasnya, 21 00:00:58,860 --> 00:01:00,980 Anda mungkin perlu menggunakan alat baris perintah tersebut. 22 00:01:00,980 --> 00:01:02,860 >> Dan karena Anda mungkin harus melakukan itu, itu 23 00:01:02,860 --> 00:01:06,280 berguna hanya untuk memahami bagaimana GDB bekerja dari baris perintah. 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 dapat menggunakan debugger grafis yang dibangun ke dalam IDE. 26 00:01:15,400 --> 00:01:18,750 Jadi untuk mendapatkan sesuatu yang terjadi dengan GDB, untuk memulai debugging 27 00:01:18,750 --> 00:01:21,220 proses tertentu Program, yang Anda butuhkan lakukan 28 00:01:21,220 --> 00:01:23,810 adalah mengetikkan GDB diikuti dengan nama program. 29 00:01:23,810 --> 00:01:28,620 Jadi misalnya, jika program anda adalah halo, Anda akan ketik GDB halo. 30 00:01:28,620 --> 00:01:31,210 >> Ketika Anda melakukan itu, Anda akan untuk menarik lingkungan GDB. 31 00:01:31,210 --> 00:01:33,800 Prompt akan berubah, dan bukannya apa biasanya 32 00:01:33,800 --> 00:01:35,841 adalah ketika Anda mengetik hal-hal di line-- perintah ls, 33 00:01:35,841 --> 00:01:38,115 cd-- semua khas Anda Perintah Linux, prompt Anda 34 00:01:38,115 --> 00:01:42,200 akan berubah menjadi, mungkin, sesuatu seperti kurung GDB kurung. 35 00:01:42,200 --> 00:01:46,630 Itu GDB baru prompt Anda, karena Anda berada di dalam lingkungan GDB. 36 00:01:46,630 --> 00:01:49,830 Sekali di dalam lingkungan itu, ada dua perintah utama 37 00:01:49,830 --> 00:01:52,290 Anda mungkin akan menggunakan dalam urutan sebagai berikut. 38 00:01:52,290 --> 00:01:55,200 >> Yang pertama adalah b, yang adalah singkatan istirahat. 39 00:01:55,200 --> 00:01:58,690 Dan setelah Anda mengetik b, Anda biasanya ketik nama dari suatu fungsi, 40 00:01:58,690 --> 00:02:01,040 atau jika Anda kebetulan tahu sekitar apa nomor baris 41 00:02:01,040 --> 00:02:04,100 program anda mulai berperilaku sedikit aneh, 42 00:02:04,100 --> 00:02:06,370 Anda dapat mengetik baris Jumlah sana juga. 43 00:02:06,370 --> 00:02:09,660 Apa b, atau istirahat, tidak adalah memungkinkan program Anda 44 00:02:09,660 --> 00:02:13,270 untuk menjalankan sampai titik tertentu, yaitu, nama fungsi 45 00:02:13,270 --> 00:02:15,880 yang Anda tentukan atau garis Jumlah yang Anda tentukan. 46 00:02:15,880 --> 00:02:18,590 >> Dan pada saat itu, akan membekukan eksekusi. 47 00:02:18,590 --> 00:02:21,670 Ini adalah hal yang benar-benar baik, karena setelah eksekusi telah dibekukan, 48 00:02:21,670 --> 00:02:25,214 Anda bisa mulai dengan sangat lambat langkah melalui program Anda. 49 00:02:25,214 --> 00:02:28,130 Biasanya, jika Anda sudah berjalan program Anda, mereka cukup singkat. 50 00:02:28,130 --> 00:02:31,250 Biasanya, Anda mengetik dot slash apapun nama program Anda, tekan Enter, 51 00:02:31,250 --> 00:02:33,470 dan sebelum Anda bisa berkedip, Anda Program sudah selesai. 52 00:02:33,470 --> 00:02:36,620 Ini tidak benar-benar banyak waktu untuk mencoba dan mencari tahu apa yang salah. 53 00:02:36,620 --> 00:02:40,920 Sehingga benar-benar dapat memperlambat segalanya turun dengan menetapkan titik istirahat dengan b, 54 00:02:40,920 --> 00:02:43,040 dan kemudian melangkah di. 55 00:02:43,040 --> 00:02:46,169 >> Kemudian setelah Anda mengatur istirahat Anda titik, Anda dapat menjalankan program. 56 00:02:46,169 --> 00:02:47,960 Dan jika Anda memiliki argumen baris perintah, 57 00:02:47,960 --> 00:02:51,610 Anda tentukan di sini, bukan ketika Anda mengetik GDB nama program Anda. 58 00:02:51,610 --> 00:02:55,980 Anda tentukan semua baris perintah argumen dengan mengambil r, atau lari, 59 00:02:55,980 --> 00:03:00,270 dan kemudian argumen baris perintah apapun Anda perlu dalam program Anda. 60 00:03:00,270 --> 00:03:03,510 Ada sejumlah lainnya benar-benar perintah penting dan berguna 61 00:03:03,510 --> 00:03:04,970 dalam lingkungan PDB. 62 00:03:04,970 --> 00:03:07,540 Jadi saya hanya cepat membahas beberapa dari mereka. 63 00:03:07,540 --> 00:03:11,320 >> Yang pertama adalah n, yang merupakan kependekan berikutnya, dan Anda dapat mengetik berikutnya bukannya n, 64 00:03:11,320 --> 00:03:12,304 keduanya akan bekerja. 65 00:03:12,304 --> 00:03:13,470 Dan itu hanya singkatan tersebut. 66 00:03:13,470 --> 00:03:17,540 Dan seperti yang Anda mungkin sudah mendapat digunakan untuk, mampu mengetik hal 67 00:03:17,540 --> 00:03:20,520 pendek umumnya lebih baik. 68 00:03:20,520 --> 00:03:24,100 Dan apa yang akan dilakukannya itu akan langkah maju satu blok kode. 69 00:03:24,100 --> 00:03:26,170 Sehingga akan bergerak maju sampai panggilan fungsi. 70 00:03:26,170 --> 00:03:28,350 Dan kemudian bukannya menyelam ke fungsi yang 71 00:03:28,350 --> 00:03:33,130 dan akan melalui semua itu fungsi kode, itu hanya akan memiliki fungsi. 72 00:03:33,130 --> 00:03:34,400 >> Fungsi akan dipanggil. 73 00:03:34,400 --> 00:03:35,733 Ini akan melakukan apa pun pekerjaan adalah. 74 00:03:35,733 --> 00:03:38,870 Ini akan mengembalikan nilai ke fungsi yang memanggilnya. 75 00:03:38,870 --> 00:03:42,490 Dan kemudian Anda akan beralih ke baris berikutnya dari fungsi panggilan. 76 00:03:42,490 --> 00:03:44,555 Jika Anda ingin melangkah dalam fungsi, 77 00:03:44,555 --> 00:03:46,430 bukan hanya memiliki itu mengeksekusi, terutama 78 00:03:46,430 --> 00:03:50,004 jika Anda berpikir bahwa masalah mungkin terletak di dalam fungsi itu, 79 00:03:50,004 --> 00:03:52,670 Anda bisa, tentu saja, mengatur istirahat titik dalam fungsi itu. 80 00:03:52,670 --> 00:03:57,820 Atau jika Anda sudah berjalan, Anda bisa menggunakan s untuk melangkah maju satu baris kode. 81 00:03:57,820 --> 00:04:01,170 >> Jadi ini akan melangkah di dan menyelam ke dalam fungsi, 82 00:04:01,170 --> 00:04:04,750 bukan hanya memiliki mengeksekusi dan melanjutkan dalam fungsi 83 00:04:04,750 --> 00:04:07,380 bahwa Anda berada dalam untuk debugging. 84 00:04:07,380 --> 00:04:09,870 Jika Anda pernah ingin tahu nilai variabel, 85 00:04:09,870 --> 00:04:12,507 Anda dapat mengetikkan p, atau Print, dan kemudian nama variabel. 86 00:04:12,507 --> 00:04:15,090 Dan yang akan mencetak kepada Anda, dalam lingkungan GDB, 87 00:04:15,090 --> 00:04:19,110 nama variabel, yang you-- alasan me-- nilai variabel 88 00:04:19,110 --> 00:04:20,064 bahwa Anda telah bernama. 89 00:04:20,064 --> 00:04:23,230 Jika Anda ingin mengetahui nilai-nilai setiap lokal variabel dapat diakses dari mana 90 00:04:23,230 --> 00:04:25,970 Saat Anda berada di Anda Program, Anda dapat mengetik Info penduduk setempat. 91 00:04:25,970 --> 00:04:28,332 Ini jauh lebih cepat dari mengetik p dan kemudian apa pun, 92 00:04:28,332 --> 00:04:30,540 daftar keluar semua variabel yang Anda tahu ada. 93 00:04:30,540 --> 00:04:34,370 Anda bisa mengetik Info penduduk setempat, dan itu akan mencetak semuanya untuk Anda. 94 00:04:34,370 --> 00:04:37,770 Selanjutnya adalah bt, yang singkatan Kembali Trace. 95 00:04:37,770 --> 00:04:41,680 Sekarang, umumnya, terutama di awal CS50, 96 00:04:41,680 --> 00:04:44,450 Anda tidak akan benar-benar memiliki kesempatan menggunakan bt, atau Kembali Trace, 97 00:04:44,450 --> 00:04:47,860 karena Anda tidak memiliki fungsi yang memanggil fungsi-fungsi lainnya. 98 00:04:47,860 --> 00:04:50,450 >> Anda mungkin memiliki utama panggilan fungsi, tapi itu mungkin hal itu. 99 00:04:50,450 --> 00:04:53,199 Anda tidak memiliki fungsi lain memanggil fungsi lain, yang 100 00:04:53,199 --> 00:04:54,880 panggilan fungsi lain, dan sebagainya. 101 00:04:54,880 --> 00:04:57,550 Tapi seperti program Anda mendapatkan lebih banyak kompleks, dan khususnya 102 00:04:57,550 --> 00:05:00,290 ketika Anda mulai bekerja dengan rekursi, kembali jejak 103 00:05:00,290 --> 00:05:05,150 dapat menjadi cara yang sangat berguna untuk membiarkan Anda jenis mendapatkan beberapa konteks untuk mana 104 00:05:05,150 --> 00:05:06,460 Saya dalam program saya. 105 00:05:06,460 --> 00:05:10,590 Jadi mengatakan Anda sudah menulis kode Anda, dan Anda tahu bahwa utama panggilan fungsi 106 00:05:10,590 --> 00:05:14,720 f, yang menyebut fungsi g, yang menyebut fungsi h. 107 00:05:14,720 --> 00:05:17,650 Jadi kita memiliki beberapa lapisan bersarang terjadi di sini. 108 00:05:17,650 --> 00:05:19,440 >> Jika Anda dalam lingkungan GDB Anda, 109 00:05:19,440 --> 00:05:21,640 dan Anda tahu Anda di dalam h, tapi Anda lupa 110 00:05:21,640 --> 00:05:27,210 tentang apa yang harus Anda ke mana Anda are-- Anda dapat mengetik bt, atau kembali jejak, 111 00:05:27,210 --> 00:05:32,370 dan itu akan mencetak h, g, f utama, bersama beberapa informasi lainnya, yang 112 00:05:32,370 --> 00:05:35,984 memberikan petunjuk bahwa, OK utama disebut f, f disebut g, g disebut h, 113 00:05:35,984 --> 00:05:37,900 dan di sanalah saya Saat berada di program saya. 114 00:05:37,900 --> 00:05:41,380 Sehingga dapat benar-benar berguna, terutama karena samar-ness GDB 115 00:05:41,380 --> 00:05:45,667 menjadi sedikit berlebihan, untuk mencari tahu di mana hal-hal yang. 116 00:05:45,667 --> 00:05:48,500 Akhirnya, ketika program Anda selesai, atau ketika Anda sudah selesai debugging itu 117 00:05:48,500 --> 00:05:50,125 dan Anda ingin melangkah pergi dari lingkungan GDB, 118 00:05:50,125 --> 00:05:51,940 hal ini membantu untuk mengetahui bagaimana untuk keluar dari itu. 119 00:05:51,940 --> 00:05:55,500 Anda bisa mengetik q, atau Keluar, keluar. 120 00:05:55,500 --> 00:05:59,220 Sekarang, sebelum video hari ini Saya menyiapkan program kereta 121 00:05:59,220 --> 00:06:03,900 disebut buggy1, yang saya dikompilasi dari file yang dikenal sebagai buggy1.c. 122 00:06:03,900 --> 00:06:06,500 Seperti yang mungkin Anda harapkan, ini Program ini sebenarnya kereta. 123 00:06:06,500 --> 00:06:08,990 Sesuatu yang tidak beres ketika saya mencoba dan menjalankannya. 124 00:06:08,990 --> 00:06:13,014 Sekarang, sayangnya, saya tidak sengaja menghapus file buggy1.c saya, 125 00:06:13,014 --> 00:06:15,930 sehingga dalam rangka bagi saya untuk mencari tahu apa yang salah dengan program ini, 126 00:06:15,930 --> 00:06:18,770 Aku akan harus menggunakan GDB jenis membabi buta, mencoba 127 00:06:18,770 --> 00:06:22,372 untuk menavigasi melalui program ini untuk mencari tahu apa yang salah. 128 00:06:22,372 --> 00:06:24,580 Tapi hanya menggunakan alat-alat kita sudah belajar tentang, 129 00:06:24,580 --> 00:06:27,700 kita dapat cukup banyak tokoh tahu persis apa itu. 130 00:06:27,700 --> 00:06:30,740 Jadi mari kita kepala ke CS50 IDE dan melihat-lihat. 131 00:06:30,740 --> 00:06:33,155 OK, jadi kita di sini di saya CS50 lingkungan IDE, 132 00:06:33,155 --> 00:06:35,697 dan saya akan memperbesar sedikit sehingga Anda dapat melihat sedikit lebih. 133 00:06:35,697 --> 00:06:38,530 Pada jendela terminal saya, jika saya daftar isi direktur saya saat ini 134 00:06:38,530 --> 00:06:41,250 dengan ls, kita akan melihat bahwa saya memiliki beberapa file sumber 135 00:06:41,250 --> 00:06:44,982 di sini, termasuk sebelumnya dibahas buggy1. 136 00:06:44,982 --> 00:06:46,940 Apa sebenarnya yang terjadi di saat Aku mencoba dan menjalankan buggy1. 137 00:06:46,940 --> 00:06:47,773 Nah mari kita cari tahu. 138 00:06:47,773 --> 00:06:52,510 Saya ketik dot slash, 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 Itu tidak baik. 141 00:06:55,000 --> 00:06:57,180 Jika Anda ingat, sebuah segmentasi kesalahan biasanya 142 00:06:57,180 --> 00:07:01,540 terjadi ketika kita mengakses memori bahwa kita tidak diperbolehkan untuk menyentuh. 143 00:07:01,540 --> 00:07:03,820 Kami telah entah bagaimana mencapai luar batas 144 00:07:03,820 --> 00:07:05,995 apa program, compiler, telah memberi kita. 145 00:07:05,995 --> 00:07:08,310 Dan sudah itu adalah petunjuk untuk tetap toolbox 146 00:07:08,310 --> 00:07:10,660 seperti yang kita memulai proses debugging. 147 00:07:10,660 --> 00:07:13,620 Sesuatu yang tidak sedikit salah di sini. 148 00:07:13,620 --> 00:07:15,935 >> Baiklah, mari kita mulai jadi up lingkungan GDB 149 00:07:15,935 --> 00:07:19,030 dan melihat apakah kita dapat mengetahui apa sebenarnya masalahnya. 150 00:07:19,030 --> 00:07:21,674 Aku akan membersihkan layar saya, dan aku akan mengetik GDB 151 00:07:21,674 --> 00:07:24,340 lagi, untuk memasuki lingkungan GDB, dan nama program 152 00:07:24,340 --> 00:07:27,450 bahwa saya ingin debug, buggy1. 153 00:07:27,450 --> 00:07:30,182 Kami mendapatkan sedikit pesan, membaca simbol dari buggy1, dilakukan. 154 00:07:30,182 --> 00:07:32,390 Semua itu berarti itu ditarik bersama-sama semua kode, 155 00:07:32,390 --> 00:07:35,570 dan sekarang sudah dimuat ke GDB, dan siap untuk pergi. 156 00:07:35,570 --> 00:07:37,140 >> Sekarang, apa yang ingin saya lakukan? 157 00:07:37,140 --> 00:07:39,130 Apakah Anda ingat apa yang Langkah pertama biasanya adalah 158 00:07:39,130 --> 00:07:42,540 setelah aku di dalam lingkungan ini? 159 00:07:42,540 --> 00:07:44,540 Mudah-mudahan, Anda mengatakan mengatur titik istirahat, karena 160 00:07:44,540 --> 00:07:46,240 pada kenyataannya itulah yang ingin saya lakukan. 161 00:07:46,240 --> 00:07:47,990 Sekarang, saya tidak memiliki kode sumber untuk ini 162 00:07:47,990 --> 00:07:50,948 di depan saya, yang mungkin tidak terjadi penggunaan yang khas, dengan cara. 163 00:07:50,948 --> 00:07:52,055 Anda mungkin akan. 164 00:07:52,055 --> 00:07:52,680 Jadi itu bagus. 165 00:07:52,680 --> 00:07:55,790 Tapi dengan asumsi Anda tidak, apa satu fungsi yang Anda tahu 166 00:07:55,790 --> 00:07:58,880 ada di setiap program C tunggal? 167 00:07:58,880 --> 00:08:04,420 Tidak peduli seberapa besar atau seberapa rumit itu, fungsi ini pasti ada. 168 00:08:04,420 --> 00:08:05,440 Utama, kan? 169 00:08:05,440 --> 00:08:08,870 >> Jadi gagal segalanya, kita bisa menetapkan titik istirahat di utama. 170 00:08:08,870 --> 00:08:12,200 Dan lagi, aku hanya bisa mengetik istirahat utama, bukannya b. 171 00:08:12,200 --> 00:08:14,650 Dan jika Anda penasaran, jika Anda pernah mengetikkan perintah yang panjang 172 00:08:14,650 --> 00:08:16,800 dan kemudian menyadari bahwa Anda mengetik hal yang salah, 173 00:08:16,800 --> 00:08:18,770 dan Anda ingin menyingkirkan semua karena saya hanya lakukan, 174 00:08:18,770 --> 00:08:22,029 Anda dapat mengambil kontrol U, yang akan menghapus segala sesuatu dan membawa Anda kembali 175 00:08:22,029 --> 00:08:23,570 ke awal baris kursor. 176 00:08:23,570 --> 00:08:26,569 Banyak lebih cepat dari hanya tahan menghapus, atau memukul kali sekelompok 177 00:08:26,569 --> 00:08:27,080 lebih. 178 00:08:27,080 --> 00:08:28,740 >> Jadi kita akan menetapkan titik istirahat di utama. 179 00:08:28,740 --> 00:08:32,970 Dan seperti yang Anda lihat, ia mengatakan kami telah menetapkan titik istirahat di berkas buggy1.c, 180 00:08:32,970 --> 00:08:36,330 dan tampaknya baris pertama dari kode utama adalah garis tujuh. 181 00:08:36,330 --> 00:08:38,080 Sekali lagi, kita tidak memiliki file sumber di sini, 182 00:08:38,080 --> 00:08:40,429 tapi saya akan menganggap bahwa itu mengatakan yang sebenarnya. 183 00:08:40,429 --> 00:08:44,510 Dan kemudian, aku hanya mencoba dan menjalankan program, r. 184 00:08:44,510 --> 00:08:45,360 Memulai program. 185 00:08:45,360 --> 00:08:48,160 Baiklah, jadi pesan ini adalah sedikit samar. 186 00:08:48,160 --> 00:08:50,160 Tapi pada dasarnya apa terjadi di sini adalah itu hanya 187 00:08:50,160 --> 00:08:53,350 mengatakan bahwa saya telah memukul istirahat saya titik, istirahat poin nomor 1. 188 00:08:53,350 --> 00:08:55,877 >> Dan kemudian, bahwa baris kode, Tidak ada berkas atau kamus tersebut. 189 00:08:55,877 --> 00:08:57,710 Satu-satunya alasan yang Saya melihat pesan yang 190 00:08:57,710 --> 00:09:00,800 adalah karena saya tidak sengaja menghapus file buggy.c saya. 191 00:09:00,800 --> 00:09:04,050 Jika file buggy1.c saya ada di direktori saat ini, 192 00:09:04,050 --> 00:09:06,920 bahwa garis kanan sebenarnya ada akan ceritakan apa baris kode 193 00:09:06,920 --> 00:09:08,214 harfiah berbunyi. 194 00:09:08,214 --> 00:09:09,380 Sayangnya, saya dihapus. 195 00:09:09,380 --> 00:09:14,790 Kita akan harus jenis menavigasi melalui ini sedikit lebih membabi buta. 196 00:09:14,790 --> 00:09:17,330 >> OK, jadi mari kita lihat, apa yang yang ingin saya lakukan di sini? 197 00:09:17,330 --> 00:09:21,770 Nah, saya ingin tahu apa lokal variabel mungkin tersedia untuk saya. 198 00:09:21,770 --> 00:09:23,570 Aku sudah mulai program saya. 199 00:09:23,570 --> 00:09:28,515 Mari kita lihat apa yang mungkin menjadi sudah diinisialisasi bagi kita. 200 00:09:28,515 --> 00:09:31,430 Saya ketik Info penduduk setempat, tidak ada penduduk setempat. 201 00:09:31,430 --> 00:09:33,960 Baiklah, sehingga tidak memberi saya satu ton informasi. 202 00:09:33,960 --> 00:09:37,600 Aku bisa mencoba dan mencetak variabel, tapi saya tidak tahu nama-nama variabel. 203 00:09:37,600 --> 00:09:39,930 Aku bisa mencoba jejak kembali, tapi aku dalam utama, 204 00:09:39,930 --> 00:09:43,710 jadi saya tahu saya belum membuat fungsi panggilan lain sekarang. 205 00:09:43,710 --> 00:09:47,710 >> Jadi sepertinya satu-satunya pilihan saya menggunakan n atau lebih dan mulai menyelam di. 206 00:09:47,710 --> 00:09:49,630 Aku akan menggunakan n. 207 00:09:49,630 --> 00:09:51,180 Jadi saya ketik n. 208 00:09:51,180 --> 00:09:53,060 Oh my gosh, apa yang terjadi di sini. 209 00:09:53,060 --> 00:09:56,260 Program sinyal yang diterima, SIGSEGV segmentasi kesalahan, 210 00:09:56,260 --> 00:09:57,880 dan kemudian sejumlah barang. 211 00:09:57,880 --> 00:09:58,880 Saya sudah kewalahan. 212 00:09:58,880 --> 00:10:00,980 Nah, sebenarnya ada banyak yang harus dipelajari di sini. 213 00:10:00,980 --> 00:10:02,520 Jadi, apa ini memberitahu kita? 214 00:10:02,520 --> 00:10:09,180 Apa itu memberitahu kita adalah, program ini adalah akan tetapi belum, kesalahan seg. 215 00:10:09,180 --> 00:10:12,550 Dan khususnya, aku akan untuk memperbesar lebih jauh di sini, 216 00:10:12,550 --> 00:10:18,980 itu akan SEG kesalahan tentang sesuatu yang disebut strcmp. 217 00:10:18,980 --> 00:10:22,705 >> Sekarang, kita tidak mungkin dibahas fungsi ini secara ekstensif. 218 00:10:22,705 --> 00:10:25,580 Tapi is-- karena kita tidak akan untuk berbicara tentang setiap fungsi yang 219 00:10:25,580 --> 00:10:28,610 ada dalam standar C library-- tapi mereka semua tersedia untuk Anda, 220 00:10:28,610 --> 00:10:32,110 terutama jika Anda mengambil melihat reference.cs50.net. 221 00:10:32,110 --> 00:10:35,000 Dan strcmp adalah benar-benar kuat fungsi yang ada di dalam 222 00:10:35,000 --> 00:10:38,070 header string.h file, yang adalah header 223 00:10:38,070 --> 00:10:41,970 file yang didedikasikan untuk fungsi yang bekerja dengan dan memanipulasi string. 224 00:10:41,970 --> 00:10:49,830 >> Dan khususnya, apa yang dilakukannya adalah strcmp membandingkan nilai-nilai dua string. 225 00:10:49,830 --> 00:10:54,160 Jadi aku akan segmentasi kesalahan panggilan untuk strcmp tampaknya. 226 00:10:54,160 --> 00:10:58,530 Aku memukul n, dan sebenarnya saya mendapatkan pesan, Program diakhiri dengan sinyal SIGSEGV 227 00:10:58,530 --> 00:11:01,370 kesalahan segmentasi. Jadi sekarang Aku benar-benar telah seg menyalahkan, 228 00:11:01,370 --> 00:11:06,479 dan program saya memiliki cukup banyak efektif menyerah. 229 00:11:06,479 --> 00:11:07,770 Ini adalah akhir dari program. 230 00:11:07,770 --> 00:11:10,370 Itu rusak, jatuh. 231 00:11:10,370 --> 00:11:14,740 Jadi tidak banyak, tapi aku benar-benar melakukan belajar cukup sedikit 232 00:11:14,740 --> 00:11:16,747 dari pengalaman kecil ini. 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 segera. 235 00:11:22,020 --> 00:11:26,300 Program saya crash pada panggilan ke strcmp, tapi aku 236 00:11:26,300 --> 00:11:30,560 tidak memiliki variabel lokal di saya Program pada saat itu crash. 237 00:11:30,560 --> 00:11:37,320 Jadi apa tali, atau string, Aku mungkin bisa membandingkan. 238 00:11:37,320 --> 00:11:42,140 Jika saya tidak memiliki lokal variabel, Anda mungkin 239 00:11:42,140 --> 00:11:45,520 menduga bahwa saya have-- ada mungkin adalah variabel global, yang bisa menjadi kenyataan. 240 00:11:45,520 --> 00:11:47,670 >> Tapi pada umumnya, tampaknya seperti aku membandingkan 241 00:11:47,670 --> 00:11:52,070 untuk sesuatu yang tidak ada. 242 00:11:52,070 --> 00:11:54,130 Jadi mari kita menyelidiki yang sedikit lebih jauh. 243 00:11:54,130 --> 00:11:55,120 Jadi aku akan membersihkan layar saya. 244 00:11:55,120 --> 00:11:57,536 Aku akan berhenti keluar dari Lingkungan GDB untuk kedua. 245 00:11:57,536 --> 00:12:01,300 Dan aku berpikir, OK, jadi ada tidak ada variabel lokal dalam program saya. 246 00:12:01,300 --> 00:12:06,444 Aku ingin tahu apakah mungkin aku seharusnya untuk lulus dalam string sebagai argumen baris perintah. 247 00:12:06,444 --> 00:12:07,610 Jadi mari kita menguji ini. 248 00:12:07,610 --> 00:12:09,020 Aku tidak melakukan ini sebelumnya. 249 00:12:09,020 --> 00:12:14,244 >> Mari kita lihat apakah mungkin jika saya menjalankan program ini dengan argumen baris perintah kerjanya. 250 00:12:14,244 --> 00:12:16,140 Huh, tidak ada segmentasi kesalahan di sana. 251 00:12:16,140 --> 00:12:17,870 Itu hanya mengatakan kepada saya bahwa saya pikir itu. 252 00:12:17,870 --> 00:12:19,170 Jadi mungkin itu memperbaiki sini. 253 00:12:19,170 --> 00:12:27,560 Dan memang, jika aku kembali dan melihat kode sumber yang sebenarnya untuk buggy1.c, 254 00:12:27,560 --> 00:12:31,180 tampaknya seolah-olah apa yang saya lakukan adalah Saya sedang membuat panggilan ke strcmp tanpa 255 00:12:31,180 --> 00:12:34,010 memeriksa apakah sebenarnya argv [1] ada. 256 00:12:34,010 --> 00:12:36,730 Ini sebenarnya adalah kode sumber untuk buggy1.c. 257 00:12:36,730 --> 00:12:38,855 Jadi apa yang saya benar-benar harus lakukan di sini untuk memperbaiki program saya, 258 00:12:38,855 --> 00:12:40,835 asumsi saya memiliki mengajukan di depan saya, adalah 259 00:12:40,835 --> 00:12:44,740 untuk hanya menambahkan cek untuk membuat yakin argc yaitu sebesar 2. 260 00:12:44,740 --> 00:12:47,780 Jadi contoh ini, sekali lagi, seperti saya katakan, adalah sedikit dibikin, kan? 261 00:12:47,780 --> 00:12:49,840 Anda umumnya tidak akan sengaja menghapus kode sumber Anda 262 00:12:49,840 --> 00:12:51,820 dan kemudian harus mencoba dan debug program. 263 00:12:51,820 --> 00:12:53,120 Tapi mudah-mudahan, itu memberi Anda ilustrasi 264 00:12:53,120 --> 00:12:55,120 dari hal-hal yang yang Anda bisa berpikir tentang 265 00:12:55,120 --> 00:12:56,610 karena Anda debugging program anda. 266 00:12:56,610 --> 00:12:58,760 >> Apa keadaan di sini? 267 00:12:58,760 --> 00:13:00,510 Variabel apa yang harus saya harus diakses dengan saya? 268 00:13:00,510 --> 00:13:03,600 Di mana tepatnya adalah program saya menerjang, apa line, 269 00:13:03,600 --> 00:13:05,240 pada apa panggilan untuk apa fungsi? 270 00:13:05,240 --> 00:13:06,952 Apa jenis petunjuk apakah itu memberi saya? 271 00:13:06,952 --> 00:13:08,910 Dan itulah yang jenis pola pikir bahwa Anda 272 00:13:08,910 --> 00:13:12,820 harus masuk ke ketika Anda berpikir tentang debugging program-program anda. 273 00:13:12,820 --> 00:13:13,820 >> Aku Doug Lloyd. 274 00:13:13,820 --> 00:13:16,140 Ini adalah CS50. 275 00:13:16,140 --> 00:15:08,642