DOUG LLOYD: Semua GDB betul. Apa yang betul-betul? Jadi GDB, yang berdiri untuk GNU Debugger, adalah alat yang benar-benar hebat yang boleh kita gunakan untuk membantu kami debug program kami, atau mengetahui di mana perkara-perkara yang yang salah dalam program-program kami. GDB adalah menakjubkan berkuasa, tetapi pengeluaran dan interaksi dengan ia boleh menjadi sedikit samar. Ia biasanya alat baris arahan, dan ia boleh membuang banyak mesej pada anda. Dan ia boleh jenis sukar untuk menghuraikan apa yang sedang berlaku. Langkah nasib baik, kami telah mengambil untuk menyelesaikan masalah ini untuk anda kerana anda bekerja melalui CS50. Jika anda tidak menggunakan grafik yang penyahpepijat, yang rakan sekerja saya Dan Armandarse telah bercakap agak sedikit kira-kira dalam video yang perlu ke sini sekarang, anda mungkin perlu untuk menggunakan baris arahan alat untuk bekerja dengan GDB. Jika anda bekerja di CS50 IDE, anda tidak perlu untuk melakukan ini. Tetapi jika anda tidak bekerja di IDE CS50, mungkin menggunakan versi CS50 Appliance, atau yang lain Linux beroperasi sistem dengan GDB dipasang di atasnya, anda mungkin perlu menggunakan alat-alat baris arahan. Dan kerana anda mungkin perlu berbuat demikian, ia berguna hanya untuk memahami bagaimana GDB bekerja dari baris arahan. Tetapi sekali lagi, jika anda menggunakan IDE CS50, anda boleh menggunakan penyahpepijat grafik yang dibina ke dalam IDE. Jadi untuk mendapatkan perkara yang berlaku dengan GDB, untuk memulakan debugging proses tertentu program, semua yang anda perlu lakukan yang menaip GDB diikuti dengan nama program ini. Jadi, sebagai contoh, jika program anda adalah hello, anda akan menaip GDB hello. Apabila anda berbuat demikian, anda akan menarik persekitaran GDB itu. Segera anda akan berubah, dan bukannya apa yang ia biasanya adalah apabila anda menaip perkara di garis ini-- arahan ls, cd-- semua biasa anda Linux perintah, segera anda akan berubah kepada, mungkin, sesuatu seperti kurungan GDB kurungan. Itulah GDB segera baru anda, kerana anda berada di dalam persekitaran GDB itu. Apabila di dalam persekitaran itu, ada dua arahan utama bahawa anda mungkin akan menggunakan mengikut susunan yang berikut. Yang pertama adalah b, yang pendek untuk percutian. Dan selepas anda menaip b, anda biasanya taip nama fungsi, atau jika anda kebetulan tahu sekitar apa nombor talian program anda bermula berkelakuan sedikit pelik, anda boleh menaip garis beberapa di sana juga. Apa b, atau percutian, adakah adalah ia membolehkan program anda berjalan sehingga titik tertentu, iaitu nama fungsi yang anda nyatakan atau baris jumlah yang anda tentukan. Dan pada ketika itu, ia akan membekukan pelaksanaan. Ini adalah satu perkara yang benar-benar baik, kerana sekali pelaksanaan telah dibekukan, anda boleh mula dengan perlahan-lahan langkah melalui program anda. Biasanya, jika anda telah berjalan program anda, mereka cukup pendek. Biasanya, anda menaip slash dot apa sahaja nama program anda, tekan Enter, dan sebelum anda boleh berkelip, anda program sudah selesai. Ia tidak benar-benar banyak masa untuk mencuba dan memikirkan apa yang berlaku salah. Jadi ia dapat melambatkan perkara ke bawah dengan menetapkan titik pulang dengan b, dan kemudian melangkah masuk. Kemudian apabila anda telah menetapkan rehat anda titik, anda boleh menjalankan program ini. Dan jika anda mempunyai apa-apa hujah baris arahan, anda tentukan mereka di sini, tidak apabila anda menaip GDB nama program anda. Anda menetapkan semua baris arahan hujah-hujah dengan mengambil r, atau berjalan, dan kemudian hujah baris arahan apa sahaja penting di dalam program anda. Terdapat beberapa yang lain benar-benar arahan penting dan berguna dalam persekitaran KDNK. Jadi biarlah saya hanya cepat pergi ke beberapa daripada mereka. Yang pertama adalah n, yang pendek untuk akan datang, dan anda boleh menaip depan dan bukannya n, kedua-duanya akan bekerja. Dan ia hanya trengkas. Dan seperti yang anda mungkin telah mendapat digunakan untuk, dapat menaip perkara lebih pendek umumnya lebih baik. Dan apa yang ia akan lakukan ialah ia akan melangkah ke hadapan satu blok kod. Jadi ia akan bergerak ke hadapan sehingga panggilan fungsi. Dan ketika itu dan bukannya menyelam ke dalam fungsi yang dan melalui semua itu fungsi kod, ia hanya akan mempunyai fungsi. Majlis tersebut akan dipanggil. Ia akan melakukan apa sahaja yang tugasnya adalah. Ia akan mengembalikan nilai kepada fungsi yang memanggilnya. Dan kemudian anda akan bergerak ke garis seterusnya bahawa fungsi panggilan. Jika anda ingin melangkah di dalam majlis itu, bukan hanya mempunyai ia melaksanakan, terutama jika anda berfikir bahawa masalah ini mungkin terletak di dalam fungsi itu, anda boleh, sudah tentu, menetapkan rehat menunjukkan dalam fungsi itu. Atau jika anda sudah berjalan, anda boleh menggunakan s untuk melangkah ke hadapan satu baris kod. Jadi ini akan campur tangan dan menyelam ke dalam fungsi, bukan hanya mempunyai melaksanakan dan berterusan di dalam fungsi bahawa anda berada dalam untuk debugging. Jika anda pernah ingin tahu nilai pembolehubah, anda boleh menaip p, atau Print, dan kemudian nama berubah-ubah. Dan yang akan mencetak untuk anda, dalam persekitaran GDB itu, nama pembolehubah, yang atasmu, maafkan me-- nilai pembolehubah yang anda telah dinamakan. Jika anda ingin tahu nilai setiap pembolehubah tempatan boleh diakses dari mana anda kini berada di dalam anda program, anda boleh menaip maklumat penduduk tempatan. Ia lebih cepat daripada menaip p dan kemudian apa sahaja, menyenaraikan semua pembolehubah yang anda tahu wujud. Anda boleh menaip maklumat penduduk tempatan, dan ia akan mencetak segala-galanya untuk anda. Sehingga seterusnya ialah bt, yang pendek untuk Kembali Trace. Sekarang, secara amnya, terutamanya pada awal CS50, anda tidak akan benar-benar mempunyai kesempatan menggunakan bt, atau Balik Trace, kerana anda tidak mempunyai fungsi yang memanggil fungsi lain. Anda mungkin mempunyai panggilan utama yang fungsi, tetapi itu mungkin ia. Anda tidak mempunyai fungsi yang lain memanggil fungsi yang lain, yang memanggil fungsi yang lain, dan sebagainya. Tetapi sebagai program anda mendapatkan lebih banyak kompleks, dan terutamanya apabila anda mula bekerja dengan rekursi, jejak kembali boleh menjadi cara yang benar-benar berguna untuk membiarkan anda sejenis mendapatkan beberapa konteks di mana Saya dalam program saya. Jadi katakan anda telah menulis kod anda, dan anda tahu bahawa utama panggilan fungsi f, yang memerlukan satu majlis g, yang menyeru fungsi h. Oleh itu, kita mempunyai beberapa lapisan bersarang berlaku di sini. Jika anda berada di dalam persekitaran GDB anda, dan anda tahu dalam anda h, tetapi anda lupa tentang apa yang mendapat anda di mana anda ialah- anda boleh menaip bt, atau dapat dikesan kembali, dan ia akan mencetak h, g, f utama, bersama beberapa maklumat lain yang memberikan anda petunjuk itu, utama OK dipanggil f, f dipanggil g, g dipanggil h, dan itulah di mana saya kini sedang dalam program saya. Oleh itu, ia boleh benar-benar berguna, terutama kerana samar-ness di GDB menjadi sedikit hangat, untuk mengetahui dengan tepat di mana perkara-perkara yang. Akhir sekali, apabila program anda dilakukan, atau apabila anda selesai debugging ia dan anda mahu untuk melangkah jauh daripada persekitaran GDB itu, ia membantu untuk mengetahui bagaimana untuk keluar daripadanya. Anda boleh menaip q, atau Henti, untuk keluar. Sekarang, sebelum video hari ini Saya menyediakan program kereta dipanggil buggy1, yang saya menyusun dari fail yang dikenali sebagai buggy1.c. Seperti yang anda jangkakan, ini program sebenarnya kereta. Ada masalah apabila saya cuba dan menjalankannya. Sekarang, malangnya, saya secara tidak sengaja dipadam fail buggy1.c saya, jadi untuk bagi saya untuk memikirkan apa yang berlaku salah dengan program ini, Saya akan perlu menggunakan GDB jenis membuta tuli, cuba untuk menavigasi melalui program ini kepada mengetahui dengan tepat apa yang berlaku salah. Tetapi dengan hanya menggunakan alat-alat kita telah belajar tentang, kita boleh angka cukup banyak mengetahui dengan tepat apa yang ada. Jadi mari kita menuju ke CS50 IDE dan lihat. OK, jadi kami di sini dalam saya CS50 persekitaran IDE, dan saya akan zum dalam sedikit supaya anda boleh melihat lebih sedikit. Dalam tetingkap terminal saya, jika saya senaraikan kandungan pengarah semasa saya dengan ls, kita akan melihat bahawa saya mempunyai beberapa fail sumber di sini, termasuk dibincangkan sebelum ini buggy1. Apa sebenarnya yang berlaku di ketika Saya cuba dan menjalankan buggy1. Nah mari kita mengetahui. Saya menaip slash dot, kereta, dan saya tekan Enter. Kesalahan segmentasi. Yang tidak baik. Jika anda masih ingat, satu segmentasi kesalahan biasanya berlaku apabila kita mengakses memori bahawa kita tidak dibenarkan untuk menyentuh. Kami telah entah bagaimana mencapai di luar batas-batas apa yang program ini, pengkompil, berikan kepada kita. Dan sebagainya sudah itu adalah satu petunjuk yang perlu toolbox seperti yang kita memulakan proses debugging. Sesuatu yang telah pergi yang salah sedikit di sini. Baiklah, jadi mari kita start persekitaran GDB yang dan lihat jika kita boleh memikirkan apa sebenarnya masalah sebenar. Saya akan mengosongkan skrin saya, dan saya akan menaip GDB sekali lagi, untuk memasuki persekitaran GDB itu, dan nama program yang saya mahu untuk debug, buggy1. Kami mendapat mesej sedikit, membaca karakter buggy1, dilakukan. Semua yang bermakna ia ditarik bersama-sama semua kod, dan kini ia telah dimuatkan ke dalam GDB, dan ia bersedia untuk pergi. Kini, apa yang saya mahu lakukan? Adakah anda masih ingat apa yang Langkah pertama biasanya adalah selepas saya di dalam alam ini? Mudah-mudahan, anda berkata ditetapkan titik rehat, kerana sebenarnya itulah yang saya mahu lakukan. Sekarang, saya tidak mempunyai Kod sumber untuk ini di depan saya, yang mungkin tidak kes penggunaan biasa, dengan cara itu. Anda mungkin akan. Jadi itulah yang baik. Tetapi dengan andaian anda tidak, apa yang fungsi salah satu yang anda tahu wujud dalam setiap program C tunggal? Tidak kira berapa besar atau berapa rumit ia adalah, fungsi ini pasti wujud. Utama, bukan? Jadi gagal segala-galanya, kita boleh menetapkan titik rehat di utama. Dan sekali lagi, saya hanya boleh menaip memecahkan utama, bukannya b. Dan jika anda ingin tahu, jika anda pernah menaip arahan yang panjang dan kemudian menyedari bahawa anda ditaip perkara yang salah, dan anda mahu untuk menghilangkan semua kerana saya hanya lakukan, anda boleh mengambil kawalan U, yang akan memadam segala-galanya dan membawa kamu kembali ke permulaan baris kursor. Banyak lebih cepat daripada hanya tahan memadam, atau memukul kali sekumpulan berakhir. Oleh itu, kita akan menetapkan titik rehat di utama. Dan seperti yang anda boleh lihat, ia mengatakan kami telah menetapkan titik pulang pada fail buggy1.c, dan nampaknya baris pertama daripada kod utama adalah garis tujuh. Sekali lagi, kita tidak mempunyai fail sumber itu di sini, tetapi saya akan menganggap bahawa itu memberitahu saya yang benar. Dan kemudian, saya hanya cuba dan menjalankan program, r. Program bermula. Baiklah, jadi pesanan ini adalah sedikit samar. Tetapi pada dasarnya apa yang berlaku di sini adalah ia hanya memberitahu saya yang saya melanda rehat saya titik, rehat titik nombor 1. Dan kemudian, yang baris kod, tiada fail atau direktori tersebut. Satu-satunya sebab yang Saya melihat mesej yang adalah kerana saya secara tidak sengaja dipadam fail buggy.c saya. Jika fail buggy1.c saya wujud dalam direktori semasa, hak garis ada akan sebenarnya beritahu saya apa baris kod literal berbunyi. Malangnya, saya memadamkannya. Kami akan perlu jenis mengemudi melalui ini sedikit lebih secara membuta tuli. OK, jadi mari kita lihat, apa yang yang saya mahu lakukan di sini? Well, saya ingin tahu apa tempatan pembolehubah mungkin disediakan untuk saya. Saya telah memulakan program saya. Mari kita lihat apa yang mungkin menjadi telah dimulakan untuk kita. Saya menaip penduduk tempatan Info, tiada penduduk tempatan. Baiklah, jadi yang tidak memberi saya satu tan maklumat. Saya boleh cuba dan mencetak pembolehubah, tetapi saya tidak tahu apa-apa nama yang berubah-ubah. Saya boleh cuba jejak kembali, tetapi saya dalam utama, jadi saya tahu saya tidak membuat satu lagi panggilan fungsi sekarang. Jadi kelihatan seperti pilihan sahaja saya adalah menggunakan n atau lebih dan mula menyelam. Saya akan menggunakan n. Jadi saya menaip n. Oh my gosh, apa yang berlaku di sini. Program menerima isyarat, SIGSEGV segmentasi kesalahan, dan kemudian sejumlah besar barangan. Saya sudah terharu. Nah, ada sebenarnya satu banyak yang boleh dipelajari di sini. Jadi, apa yang ini kepada kita? Apa yang ia memberitahu kita adalah, program ini adalah kira-kira, tetapi belum lagi, kesalahan seg. Dan khususnya, saya akan untuk mengezum masuk lebih jauh lagi di sini, ia adalah kira-kira untuk seg bersalah tentang sesuatu yang dinamakan strcmp. Sekarang, kita mungkin tidak dibincangkan fungsi ini secara meluas. Tetapi ia is-- kerana kita tidak akan untuk bercakap tentang setiap fungsi yang wujud dalam standard C library-- tetapi mereka semua disediakan untuk anda, terutamanya jika anda mengambil melihat reference.cs50.net. Dan strcmp adalah benar-benar kuat fungsi yang wujud di dalam pengepala string.h fail, yang boleh menanduk fail yang khusus untuk fungsi yang bekerja dengan dan memanipulasi tali. Dan khususnya, apa yang dilakukan adalah strcmp ia membandingkan nilai dua tali. Jadi saya kira-kira untuk segmentasi kesalahan dalam panggilan untuk strcmp ia seolah-olah. Saya memukul n, dan sebenarnya saya mendapat mesej, Program ditamatkan dengan isyarat SIGSEGV segmentasi bersalah. Jadi sekarang Saya sebenarnya telah seg disalahkan, dan program saya mempunyai cukup lebih berkesan berputus asa. Ini adalah akhir program. Ia rosak, ia terhempas. Jadi tidak banyak, tetapi saya sebenarnya tidak belajar agak sedikit daripada pengalaman ini sedikit. Apa yang telah saya pelajari? Nah, program saya crash cukup banyak dengan segera. Program saya kemalangan pada yang menyeru kepada strcmp, tetapi saya tidak mempunyai pembolehubah tempatan dalam saya program pada masa itu bahawa ia kemalangan. Jadi apa tali, atau tali, boleh saya mungkin menjadi membandingkan. Jika saya tidak mempunyai apa-apa tempatan pembolehubah, anda mungkin menduga bahawa saya ada-- mungkin ada ialah berubah-ubah global, yang boleh menjadi benar. Tetapi secara amnya, ia seolah-olah seperti saya membandingkan kepada sesuatu yang tidak wujud. Jadi mari kita menyiasat yang sedikit lagi. Jadi saya akan untuk mengosongkan skrin saya. Saya akan berhenti daripada Persekitaran GDB untuk kali kedua. Dan saya berfikir, OK, jadi tidak tidak pembolehubah tempatan dalam program saya. Saya tertanya-tanya jika mungkin saya sepatutnya lulus dalam rentetan sebagai hujah baris arahan. Jadi mari kita menguji ini keluar. Saya tidak melakukan ini sebelum ini. Mari kita lihat jika mungkin jika saya menjalankan program ini dengan hujah baris arahan ia berfungsi. Huh, tidak ada kesalahan segmentasi sana. Ia hanya memberitahu saya bahawa saya menganggap ia keluar. Jadi mungkin itu tetap di sini. Dan sesungguhnya, jika saya kembali dan melihat kod sumber sebenar untuk buggy1.c, nampaknya seperti apa yang saya lakukan adalah Saya membuat panggilan kepada strcmp tanpa memeriksa sama ada sebenarnya argv [1] wujud. Ini sebenarnya adalah Kod sumber untuk buggy1.c. Jadi apa yang saya benar-benar perlu lakukan di sini untuk menetapkan program saya, menganggap saya mempunyai memfailkan di hadapan saya, hanya menambah cek untuk membuat memastikan argc yang sama dengan 2. Jadi contoh ini, sekali lagi, seperti saya katakan, adalah sedikit dibuat-buat, kan? Anda biasanya tidak akan tidak sengaja memadam kod sumber anda dan kemudian perlu cuba dan debug program ini. Tetapi mudah-mudahan, ia memberikan anda ilustrasi daripada jenis perkara-perkara yang anda boleh berfikir tentang seperti yang anda sedang debugging program anda. Apakah keadaan urusan di sini? Apakah pembolehubah saya mempunyai akses kepada saya? Di mana sebenarnya program saya terhempas, kepada apa line, kepada apa panggilan untuk apa fungsi? Apakah jenis petunjuk adakah itu memberi saya? Dan itulah yang jenis pemikiran yang perlu masuk ke apabila anda berada memikirkan debugging program anda. Saya Doug Lloyd. Ini adalah CS50.