Doug LLOYD: Baiklah GDB. Apa itu sebenarnya? Jadi GDB, yang berdiri untuk GNU Debugger, adalah alat yang sangat mengagumkan bahwa kita bisa gunakan untuk membantu kami men-debug program kami, atau mencari tahu di mana hal-hal yang akan salah dalam program kami. GDB adalah luar biasa kuat, tapi output dan interaksi dengan itu dapat menjadi sedikit samar. Ini biasanya alat baris perintah, dan dapat membuang banyak pesan pada Anda. Dan itu bisa agak sulit untuk mengurai persis apa yang terjadi. Langkah Untungnya, kami sudah untuk memperbaiki masalah ini untuk Anda saat Anda bekerja melalui CS50. Jika Anda tidak menggunakan grafis yang debugger, yang rekan saya Dan Armandarse telah berbicara cukup sedikit tentang dalam video yang harus di sini sekarang, Anda mungkin perlu menggunakan baris perintah ini alat untuk bekerja dengan GDB. Jika Anda bekerja di CS50 IDE, Anda tidak perlu melakukan hal ini. Tapi jika Anda tidak bekerja di CS50 IDE, mungkin menggunakan versi dari CS50 Appliance, atau operasi Linux lain sistem dengan GDB diinstal di atasnya, Anda mungkin perlu menggunakan alat baris perintah tersebut. Dan karena Anda mungkin harus melakukan itu, itu berguna hanya untuk memahami bagaimana GDB bekerja dari baris perintah. Tetapi sekali lagi, jika Anda menggunakan IDE CS50, Anda dapat menggunakan debugger grafis yang dibangun ke dalam IDE. Jadi untuk mendapatkan sesuatu yang terjadi dengan GDB, untuk memulai debugging proses tertentu Program, yang Anda butuhkan lakukan adalah mengetikkan GDB diikuti dengan nama program. Jadi misalnya, jika program anda adalah halo, Anda akan ketik GDB halo. Ketika Anda melakukan itu, Anda akan untuk menarik lingkungan GDB. Prompt akan berubah, dan bukannya apa biasanya adalah ketika Anda mengetik hal-hal di line-- perintah ls, cd-- semua khas Anda Perintah Linux, prompt Anda akan berubah menjadi, mungkin, sesuatu seperti kurung GDB kurung. Itu GDB baru prompt Anda, karena Anda berada di dalam lingkungan GDB. Sekali di dalam lingkungan itu, ada dua perintah utama Anda mungkin akan menggunakan dalam urutan sebagai berikut. Yang pertama adalah b, yang adalah singkatan istirahat. Dan setelah Anda mengetik b, Anda biasanya ketik nama dari suatu fungsi, atau jika Anda kebetulan tahu sekitar apa nomor baris program anda mulai berperilaku sedikit aneh, Anda dapat mengetik baris Jumlah sana juga. Apa b, atau istirahat, tidak adalah memungkinkan program Anda untuk menjalankan sampai titik tertentu, yaitu, nama fungsi yang Anda tentukan atau garis Jumlah yang Anda tentukan. Dan pada saat itu, akan membekukan eksekusi. Ini adalah hal yang benar-benar baik, karena setelah eksekusi telah dibekukan, Anda bisa mulai dengan sangat lambat langkah melalui program Anda. Biasanya, jika Anda sudah berjalan program Anda, mereka cukup singkat. Biasanya, Anda mengetik dot slash apapun nama program Anda, tekan Enter, dan sebelum Anda bisa berkedip, Anda Program sudah selesai. Ini tidak benar-benar banyak waktu untuk mencoba dan mencari tahu apa yang salah. Sehingga benar-benar dapat memperlambat segalanya turun dengan menetapkan titik istirahat dengan b, dan kemudian melangkah di. Kemudian setelah Anda mengatur istirahat Anda titik, Anda dapat menjalankan program. Dan jika Anda memiliki argumen baris perintah, Anda tentukan di sini, bukan ketika Anda mengetik GDB nama program Anda. Anda tentukan semua baris perintah argumen dengan mengambil r, atau lari, dan kemudian argumen baris perintah apapun Anda perlu dalam program Anda. Ada sejumlah lainnya benar-benar perintah penting dan berguna dalam lingkungan PDB. Jadi saya hanya cepat membahas beberapa dari mereka. Yang pertama adalah n, yang merupakan kependekan berikutnya, dan Anda dapat mengetik berikutnya bukannya n, keduanya akan bekerja. Dan itu hanya singkatan tersebut. Dan seperti yang Anda mungkin sudah mendapat digunakan untuk, mampu mengetik hal pendek umumnya lebih baik. Dan apa yang akan dilakukannya itu akan langkah maju satu blok kode. Sehingga akan bergerak maju sampai panggilan fungsi. Dan kemudian bukannya menyelam ke fungsi yang dan akan melalui semua itu fungsi kode, itu hanya akan memiliki fungsi. Fungsi akan dipanggil. Ini akan melakukan apa pun pekerjaan adalah. Ini akan mengembalikan nilai ke fungsi yang memanggilnya. Dan kemudian Anda akan beralih ke baris berikutnya dari fungsi panggilan. Jika Anda ingin melangkah dalam fungsi, bukan hanya memiliki itu mengeksekusi, terutama jika Anda berpikir bahwa masalah mungkin terletak di dalam fungsi itu, Anda bisa, tentu saja, mengatur istirahat titik dalam fungsi itu. Atau jika Anda sudah berjalan, Anda bisa menggunakan s untuk melangkah maju satu baris kode. Jadi ini akan melangkah di dan menyelam ke dalam fungsi, bukan hanya memiliki mengeksekusi dan melanjutkan dalam fungsi bahwa Anda berada dalam untuk debugging. Jika Anda pernah ingin tahu nilai variabel, Anda dapat mengetikkan p, atau Print, dan kemudian nama variabel. Dan yang akan mencetak kepada Anda, dalam lingkungan GDB, nama variabel, yang you-- alasan me-- nilai variabel bahwa Anda telah bernama. Jika Anda ingin mengetahui nilai-nilai setiap lokal variabel dapat diakses dari mana Saat Anda berada di Anda Program, Anda dapat mengetik Info penduduk setempat. Ini jauh lebih cepat dari mengetik p dan kemudian apa pun, daftar keluar semua variabel yang Anda tahu ada. Anda bisa mengetik Info penduduk setempat, dan itu akan mencetak semuanya untuk Anda. Selanjutnya adalah bt, yang singkatan Kembali Trace. Sekarang, umumnya, terutama di awal CS50, Anda tidak akan benar-benar memiliki kesempatan menggunakan bt, atau Kembali Trace, karena Anda tidak memiliki fungsi yang memanggil fungsi-fungsi lainnya. Anda mungkin memiliki utama panggilan fungsi, tapi itu mungkin hal itu. Anda tidak memiliki fungsi lain memanggil fungsi lain, yang panggilan fungsi lain, dan sebagainya. Tapi seperti program Anda mendapatkan lebih banyak kompleks, dan khususnya ketika Anda mulai bekerja dengan rekursi, kembali jejak dapat menjadi cara yang sangat berguna untuk membiarkan Anda jenis mendapatkan beberapa konteks untuk mana Saya dalam program saya. Jadi mengatakan Anda sudah menulis kode Anda, dan Anda tahu bahwa utama panggilan fungsi f, yang menyebut fungsi g, yang menyebut fungsi h. Jadi kita memiliki beberapa lapisan bersarang terjadi di sini. Jika Anda dalam lingkungan GDB Anda, dan Anda tahu Anda di dalam h, tapi Anda lupa tentang apa yang harus Anda ke mana Anda are-- Anda dapat mengetik bt, atau kembali jejak, dan itu akan mencetak h, g, f utama, bersama beberapa informasi lainnya, yang memberikan petunjuk bahwa, OK utama disebut f, f disebut g, g disebut h, dan di sanalah saya Saat berada di program saya. Sehingga dapat benar-benar berguna, terutama karena samar-ness GDB menjadi sedikit berlebihan, untuk mencari tahu di mana hal-hal yang. Akhirnya, ketika program Anda selesai, atau ketika Anda sudah selesai debugging itu dan Anda ingin melangkah pergi dari lingkungan GDB, hal ini membantu untuk mengetahui bagaimana untuk keluar dari itu. Anda bisa mengetik q, atau Keluar, keluar. Sekarang, sebelum video hari ini Saya menyiapkan program kereta disebut buggy1, yang saya dikompilasi dari file yang dikenal sebagai buggy1.c. Seperti yang mungkin Anda harapkan, ini Program ini sebenarnya kereta. Sesuatu yang tidak beres ketika saya mencoba dan menjalankannya. Sekarang, sayangnya, saya tidak sengaja menghapus file buggy1.c saya, sehingga dalam rangka bagi saya untuk mencari tahu apa yang salah dengan program ini, Aku akan harus menggunakan GDB jenis membabi buta, mencoba untuk menavigasi melalui program ini untuk mencari tahu apa yang salah. Tapi hanya menggunakan alat-alat kita sudah belajar tentang, kita dapat cukup banyak tokoh tahu persis apa itu. Jadi mari kita kepala ke CS50 IDE dan melihat-lihat. OK, jadi kita di sini di saya CS50 lingkungan IDE, dan saya akan memperbesar sedikit sehingga Anda dapat melihat sedikit lebih. Pada jendela terminal saya, jika saya daftar isi direktur saya saat ini dengan ls, kita akan melihat bahwa saya memiliki beberapa file sumber di sini, termasuk sebelumnya dibahas buggy1. Apa sebenarnya yang terjadi di saat Aku mencoba dan menjalankan buggy1. Nah mari kita cari tahu. Saya ketik dot slash, kereta, dan saya tekan Enter. Kesalahan segmentasi. Itu tidak baik. Jika Anda ingat, sebuah segmentasi kesalahan biasanya terjadi ketika kita mengakses memori bahwa kita tidak diperbolehkan untuk menyentuh. Kami telah entah bagaimana mencapai luar batas apa program, compiler, telah memberi kita. Dan sudah itu adalah petunjuk untuk tetap toolbox seperti yang kita memulai proses debugging. Sesuatu yang tidak sedikit salah di sini. Baiklah, mari kita mulai jadi up lingkungan GDB dan melihat apakah kita dapat mengetahui apa sebenarnya masalahnya. Aku akan membersihkan layar saya, dan aku akan mengetik GDB lagi, untuk memasuki lingkungan GDB, dan nama program bahwa saya ingin debug, buggy1. Kami mendapatkan sedikit pesan, membaca simbol dari buggy1, dilakukan. Semua itu berarti itu ditarik bersama-sama semua kode, dan sekarang sudah dimuat ke GDB, dan siap untuk pergi. Sekarang, apa yang ingin saya lakukan? Apakah Anda ingat apa yang Langkah pertama biasanya adalah setelah aku di dalam lingkungan ini? Mudah-mudahan, Anda mengatakan mengatur titik istirahat, karena pada kenyataannya itulah yang ingin saya lakukan. Sekarang, saya tidak memiliki kode sumber untuk ini di depan saya, yang mungkin tidak terjadi penggunaan yang khas, dengan cara. Anda mungkin akan. Jadi itu bagus. Tapi dengan asumsi Anda tidak, apa satu fungsi yang Anda tahu ada di setiap program C tunggal? Tidak peduli seberapa besar atau seberapa rumit itu, fungsi ini pasti ada. Utama, kan? Jadi gagal segalanya, kita bisa menetapkan titik istirahat di utama. Dan lagi, aku hanya bisa mengetik istirahat utama, bukannya b. Dan jika Anda penasaran, jika Anda pernah mengetikkan perintah yang panjang dan kemudian menyadari bahwa Anda mengetik hal yang salah, dan Anda ingin menyingkirkan semua karena saya hanya lakukan, Anda dapat mengambil kontrol U, yang akan menghapus segala sesuatu dan membawa Anda kembali ke awal baris kursor. Banyak lebih cepat dari hanya tahan menghapus, atau memukul kali sekelompok lebih. Jadi kita akan menetapkan titik istirahat di utama. Dan seperti yang Anda lihat, ia mengatakan kami telah menetapkan titik istirahat di berkas buggy1.c, dan tampaknya baris pertama dari kode utama adalah garis tujuh. Sekali lagi, kita tidak memiliki file sumber di sini, tapi saya akan menganggap bahwa itu mengatakan yang sebenarnya. Dan kemudian, aku hanya mencoba dan menjalankan program, r. Memulai program. Baiklah, jadi pesan ini adalah sedikit samar. Tapi pada dasarnya apa terjadi di sini adalah itu hanya mengatakan bahwa saya telah memukul istirahat saya titik, istirahat poin nomor 1. Dan kemudian, bahwa baris kode, Tidak ada berkas atau kamus tersebut. Satu-satunya alasan yang Saya melihat pesan yang adalah karena saya tidak sengaja menghapus file buggy.c saya. Jika file buggy1.c saya ada di direktori saat ini, bahwa garis kanan sebenarnya ada akan ceritakan apa baris kode harfiah berbunyi. Sayangnya, saya dihapus. Kita akan harus jenis menavigasi melalui ini sedikit lebih membabi buta. OK, jadi mari kita lihat, apa yang yang ingin saya lakukan di sini? Nah, saya ingin tahu apa lokal variabel mungkin tersedia untuk saya. Aku sudah mulai program saya. Mari kita lihat apa yang mungkin menjadi sudah diinisialisasi bagi kita. Saya ketik Info penduduk setempat, tidak ada penduduk setempat. Baiklah, sehingga tidak memberi saya satu ton informasi. Aku bisa mencoba dan mencetak variabel, tapi saya tidak tahu nama-nama variabel. Aku bisa mencoba jejak kembali, tapi aku dalam utama, jadi saya tahu saya belum membuat fungsi panggilan lain sekarang. Jadi sepertinya satu-satunya pilihan saya menggunakan n atau lebih dan mulai menyelam di. Aku akan menggunakan n. Jadi saya ketik n. Oh my gosh, apa yang terjadi di sini. Program sinyal yang diterima, SIGSEGV segmentasi kesalahan, dan kemudian sejumlah barang. Saya sudah kewalahan. Nah, sebenarnya ada banyak yang harus dipelajari di sini. Jadi, apa ini memberitahu kita? Apa itu memberitahu kita adalah, program ini adalah akan tetapi belum, kesalahan seg. Dan khususnya, aku akan untuk memperbesar lebih jauh di sini, itu akan SEG kesalahan tentang sesuatu yang disebut strcmp. Sekarang, kita tidak mungkin dibahas fungsi ini secara ekstensif. Tapi is-- karena kita tidak akan untuk berbicara tentang setiap fungsi yang ada dalam standar C library-- tapi mereka semua tersedia untuk Anda, terutama jika Anda mengambil melihat reference.cs50.net. Dan strcmp adalah benar-benar kuat fungsi yang ada di dalam header string.h file, yang adalah header file yang didedikasikan untuk fungsi yang bekerja dengan dan memanipulasi string. Dan khususnya, apa yang dilakukannya adalah strcmp membandingkan nilai-nilai dua string. Jadi aku akan segmentasi kesalahan panggilan untuk strcmp tampaknya. Aku memukul n, dan sebenarnya saya mendapatkan pesan, Program diakhiri dengan sinyal SIGSEGV kesalahan segmentasi. Jadi sekarang Aku benar-benar telah seg menyalahkan, dan program saya memiliki cukup banyak efektif menyerah. Ini adalah akhir dari program. Itu rusak, jatuh. Jadi tidak banyak, tapi aku benar-benar melakukan belajar cukup sedikit dari pengalaman kecil ini. Apa yang telah saya pelajari? Nah, program saya crash cukup banyak segera. Program saya crash pada panggilan ke strcmp, tapi aku tidak memiliki variabel lokal di saya Program pada saat itu crash. Jadi apa tali, atau string, Aku mungkin bisa membandingkan. Jika saya tidak memiliki lokal variabel, Anda mungkin menduga bahwa saya have-- ada mungkin adalah variabel global, yang bisa menjadi kenyataan. Tapi pada umumnya, tampaknya seperti aku membandingkan untuk sesuatu yang tidak ada. Jadi mari kita menyelidiki yang sedikit lebih jauh. Jadi aku akan membersihkan layar saya. Aku akan berhenti keluar dari Lingkungan GDB untuk kedua. Dan aku berpikir, OK, jadi ada tidak ada variabel lokal dalam program saya. Aku ingin tahu apakah mungkin aku seharusnya untuk lulus dalam string sebagai argumen baris perintah. Jadi mari kita menguji ini. Aku tidak melakukan ini sebelumnya. Mari kita lihat apakah mungkin jika saya menjalankan program ini dengan argumen baris perintah kerjanya. Huh, tidak ada segmentasi kesalahan di sana. Itu hanya mengatakan kepada saya bahwa saya pikir itu. Jadi mungkin itu memperbaiki sini. Dan memang, jika aku kembali dan melihat kode sumber yang sebenarnya untuk buggy1.c, tampaknya seolah-olah apa yang saya lakukan adalah Saya sedang membuat panggilan ke strcmp tanpa memeriksa apakah sebenarnya argv [1] ada. Ini sebenarnya adalah kode sumber untuk buggy1.c. Jadi apa yang saya benar-benar harus lakukan di sini untuk memperbaiki program saya, asumsi saya memiliki mengajukan di depan saya, adalah untuk hanya menambahkan cek untuk membuat yakin argc yaitu sebesar 2. Jadi contoh ini, sekali lagi, seperti saya katakan, adalah sedikit dibikin, kan? Anda umumnya tidak akan sengaja menghapus kode sumber Anda dan kemudian harus mencoba dan debug program. Tapi mudah-mudahan, itu memberi Anda ilustrasi dari hal-hal yang yang Anda bisa berpikir tentang karena Anda debugging program anda. Apa keadaan di sini? Variabel apa yang harus saya harus diakses dengan saya? Di mana tepatnya adalah program saya menerjang, apa line, pada apa panggilan untuk apa fungsi? Apa jenis petunjuk apakah itu memberi saya? Dan itulah yang jenis pola pikir bahwa Anda harus masuk ke ketika Anda berpikir tentang debugging program-program anda. Aku Doug Lloyd. Ini adalah CS50.