[Powered by Google Translate] GDB, Proyek GNU Debugger, adalah alat yang ampuh untuk debugging C,
bersama dengan banyak bahasa lainnya.
Hal ini memungkinkan Anda untuk melihat-lihat di dalam program Anda C ketika mereka mengeksekusi,
dan juga memberikan Anda kesempatan untuk melihat apa yang terjadi
ketika crash program anda.
Ini cukup bagus, kan?
GDB adalah perangkat lunak bebas, dan berjalan pada UNIX populer dan
Berbasis Windows sistem operasi, sehingga alat yang sangat luas.
>> Anda harus belajar untuk menyukainya.
Pro GDB memiliki waktu yang jauh lebih mudah melacak bug
dibandingkan dengan mereka yang menggunakan kekisruhan melalui tebakan
dan jumlah tak terbatas pernyataan cetakan.
GDB adalah alat baris perintah, yang berarti Anda dapat berinteraksi dengan itu dalam terminal
mengeluarkan perintah melalui keyboard daripada mengklik tombol dengan mouse anda.
>> Untuk memulai GDB, Anda benar-benar hanya gdb pada prompt dan tekan enter.
Anda akan melihat beberapa baris dicetak ke layar
menunjukkan kepada Anda versi GDB bahwa Anda menjalankan,
informasi hak cipta, dan pada akhirnya Anda akan melihat prompt GDB: (gdb).
Ini memungkinkan Anda tahu bahwa GDB siap untuk perintah.
Pada titik ini, hal yang paling penting untuk mengetahui bagaimana melakukan adalah berhenti.
Untungnya, ini cukup sederhana.
Perintah berhenti tidak hanya itu.
Sebagai jalan pintas, Anda hanya dapat menggunakan q juga.
Menyenangkan seperti boot up GDB dan kemudian segera berhenti adalah,
mari kita sekarang berbicara tentang menggunakan GDB untuk membantu men-debug program.
>> Untuk memulai, saya punya program di sini di factorial.c
yang mendapat int dan mencoba untuk menghitung faktorial nya.
Dalam kasus Anda belum melihat faktorial sebelumnya atau tidak ingat mereka,
Faktorial dari jumlah n adalah sama dengan produk dari n - (n - 1), (n - 2), dan seterusnya -
sampai Anda mencapai 1.
Oleh karena itu, faktorial dari 3 adalah 3 * 2 * 1, atau 6,
dan faktorial 4 adalah 4 * 3 * 2 * 1, atau 24.
Faktorial dari nol merupakan kasus yang aneh, itu 1,
dan faktorial bilangan bulat negatif tidak didefinisikan.
Pokoknya, sesuatu tentang program faktorial saya funky.
Ketika saya menjalankannya, ia akan mencetak angka aneh yang tidak ada hubungannya dengan faktorial.
>> Jadi, kita dapat menggunakan GDB untuk membantu mencari tahu apa yang terjadi.
GDB beroperasi pada file executable,
yang merupakan file biner yang dihasilkan oleh proses kompilasi.
Artinya, kita tidak dapat menjalankan GDB pada c kami. Atau file h kode sumber seperti factorial.c..
Kami ingin menjalankannya hanya pada faktorial sebagai gantinya.
Jika program yang dibutuhkan setiap argumen baris perintah,
ini adalah di mana kita akan menentukan mereka.
Dalam hal ini, faktorial tidak memerlukan argumen baris perintah,
jadi kami hanya menjalankan atau ketik r untuk pendek.
>> Ini akan memulai program berjalan faktorial.
Ketika program berhenti berjalan, saya akan mendapatkan GDB saya meminta kembali.
Oke, mari kita coba hal yang sama lagi, faktorial 4.
Baiklah, kita melihat bahwa kita mendapatkan jenis yang sama dari sampah di sini di GDB.
Sekarang program tersebut telah selesai,
kita tidak bisa masuk dan mengakses salah satu dari negaranya,
jadi kita harus mulai berjalan lagi sebelum kita bisa melihat apa yang terjadi.
Namun, kita perlu cara untuk menghentikannya sementara itu di tengah-tengah menjalankan nya.
>> Untuk melakukan itu, kita menggunakan apa yang disebut breakpoint.
Breakpoints memberitahu GDB untuk menghentikan program pada fungsi tertentu atau baris kode sumber
sehingga kita bisa memeriksa keadaan program,
nilai-nilai variabel, keadaan memori dan semacamnya, pada saat itu.
Karena saya tidak benar-benar tahu di mana sesuatu yang buruk terjadi,
>> Saya hanya ingin memulai debug tepat di awal,
tepat ketika utama dimulai.
Kami akan mengatur breakpoint pada awal utama menggunakan perintah istirahat.
Kita juga bisa menggunakan b untuk menyingkat istirahat.
Sekarang mari kita mulai program berjalan lagi.
Di sini kita berada di awal utama, seperti GDB memberitahu kita.
Baris kode yang akan mengeksekusi namun belum
adalah baris printf.
Kita bisa mengatakan GDB untuk mengeksekusi baris kode ini dan pergi ke baris berikutnya
dengan perintah selanjutnya atau n.
>> Baiklah, sekarang GDB memberitahu kita bahwa kita berada di jalur GetInt.
Saya tahu bahwa sepertinya baris printf tidak dijalankan
karena kita tidak melihat "Masukkan bilangan bulat positif" print out di layar,
tapi itu benar-benar dijalankan.
Apa yang kita lihat adalah sistem operasi menekan apapun tulisan ke layar
sampai benar-benar harus, yang mengapa debugging dengan cetakan
kadang-kadang bisa diandalkan.
Pokoknya, mari kita lagi pergi ke baris berikutnya kode dan masuk dalam sebuah int.
Sekali lagi, mari kita tipe 4.
Jadi ini terlihat aneh. Kami berada di baris 12 sesuai dengan GDB,
tapi baris berikutnya yang akan mengeksekusi hanya penjepit keriting.
>> Itu hanya berarti kita berada di akhir loop, kami lakukan sementara loop pada kenyataannya,
GDB dan mengatakan kepada kita bahwa kondisi terminasi, yaitu tidak kurang dari nol,
akan mengeksekusi berikutnya.
Jika ini pernah mendapat sedikit membingungkan,
kita dapat menarik kode sumber dalam GDB dengan daftar atau perintah l.
Hal ini mencetak kode sumber
yang berpusat di sekitar garis bahwa kita saat ini.
Jika kita mengetik daftar atau l lagi, kita akan melihat set berikutnya garis mencetak.
Kita bisa melakukan hal ini sampai kita memukul akhir file.
>> Untuk kembali ke tempat kami, kami dapat menyediakan daftar dengan nomor baris,
dalam kasus ini, baris 12.
Pokoknya, mari kita lanjutkan.
Sekarang kita berada di lingkaran 4.
Mari kita pastikan bahwa variabel num kami berisi 4.
Kami melakukan ini dengan cetak, atau p, perintah.
Jadi, GDB memberitahu kita bahwa num memang menyimpan 4, seperti yang kami harapkan.
$ 1 GDB yang mencetak adalah variabel GDB khusus
yang kini ditetapkan untuk menyimpan 4 angka juga.
Anda dapat mengabaikan ini untuk saat ini, namun variabel-variabel GDB datang di super berguna
dalam kasus-kasus yang lebih maju bila Anda ingin mengingat apa yang telah Anda lakukan di masa lalu.
Pokoknya, bergerak dengan berikutnya, kita melihat bahwa kita mulai bergerak melalui untuk loop.
Mari kita terus melalui sini dengan bit n demi sedikit.
Daripada mengetik n setiap kali, Anda juga dapat hanya tekan enter.
Ketika Anda tekan enter tanpa mengetik apa-apa, GDB hanya mengulangi perintah sebelumnya.
Jadi sekarang kita telah memukul panggilan printf.
Sepertinya kita memang pergi melalui kami untuk loop 4 kali,
yang adalah apa yang kita ingin lakukan dalam rangka kalikan dengan 1, 2, 3, dan 4.
>> Semuanya tampak seperti itu bekerja,
kecuali ketika kita memukul berikutnya lagi kita mendapatkan sejumlah besar bukannya 24.
Jika kita mencetak nilai p menggunakan faktorial,
kita melihat bahwa faktorial tidak memiliki jumlah besar di dalamnya.
Sesuatu yang pasti akan salah.
Pada titik ini, meskipun, kita hampir di akhir program,
dan sudah terlambat untuk memperbaiki apa-apa.
>> Namun, kita dapat memulai program dengan mengetik r lagi dan kemudian y untuk mengkonfirmasi.
Sekarang kita kembali pada breakpoint kami pada awal utama.
Kita tahu bahwa segala sesuatu tampaknya baik-baik saja dengan membaca di n.
sehingga kita bisa melompat ke depan dengan n.
Atau, kita dapat mengatur breakpoint baru setelah melakukan sementara loop
dan melompat di sana. Mari kita lakukan itu.
Sepertinya baris 14 datang hanya setelah loop.
Mari kita mengatur breakpoint sana.
Ini praktik yang baik untuk menentukan nama file dalam perintah breakpoint
sejak GDB dapat bingung jika Anda bekerja dengan beberapa file.
Untuk bergerak maju dari breakpoint ini, kita akan menggunakan berlanjut atau perintah c.
>> Oke, di sini kita berada di untuk loop.
Ayo baris 1 lebih ke dalam untuk loop,
dan kemudian kita akan mulai mencetak variabel untuk melihat apa yang terjadi.
Mari kita pastikan bahwa saya memang 1, seperti yang diharapkan.
Yup, itu semua baik.
Bagaimana faktorial meskipun?
Whoa, itu tidak baik.
Kami punya angka negatif besar di sini.
Bagaimana itu terjadi?
Nah, jika kita melihat kembali kode,
kita melihat bahwa kita tidak pernah diinisialisasi itu, jadi kami hanya punya sampah di sana.
Yang pasti akan membuang perhitungan kami.
>> Untungnya, kita tidak harus meninggalkan GDB untuk memperbaiki hal ini.
Kita dapat menginisialisasi benar di sini dan memperbaikinya dalam kode kemudian menggunakan perintah cetak.
Kami akan menginisialisasi ke 1 sejak faktorial dari nol dan 1 keduanya 1,
dan jika kita menginisialisasi ke nol, maka kita akan selalu berakhir dengan nol sebagai hasilnya kami.
Anda dapat mengatur cara ini variabel, yang super berguna.
Sekarang, mari kita lanjutkan program kami.
Mari kita pastikan semuanya di mana itu seharusnya.
Num harus 4, saya harus 1, dan faktorial harus 1 juga.
Kita dapat jalan pintas proses ini dan mencetak semua variabel lokal kami
dengan super membantu penduduk setempat Info perintah,
yang mencetak semua di-lingkup variabel lokal kami.
Pokoknya, sepertinya semuanya baik untuk pergi.
>> Mari kita lakukan lagi go-sekitar loop hanya untuk memastikan.
Oke, semuanya tampak hebat.
Sekarang kita dapat menggunakan perintah continue untuk pergi sampai akhir.
Manis! 4 faktorial dicetak 24 seperti yang diharapkan.
Sekarang kita bisa memperbaiki ini dalam kode kita.
Daripada berhenti keluar dari GDB, kita akan menggunakan tab lain terminal untuk melakukan hal ini.
Kembali ke tab GDB kita, sekarang kita perlu mengkompilasi ulang dieksekusi kami.
Salah satu hal terbaik tentang GDB adalah bahwa Anda tidak perlu meninggalkan GDB untuk menjalankan make.
Sehingga kita tidak terus memukul breakpoints tua,
mari kita menonaktifkan mereka dengan, Anda dapat menebaknya, menonaktifkan perintah.
Ini akan menonaktifkan semua breakpoints kami.
Sekarang, kita dapat me-restart program dengan r dan memastikan semuanya baik-baik saja.
Sepertinya semuanya baik untuk pergi.
Faktorial dari 4 print 24, sama seperti kami pikir.
GDB adalah salah satu alat yang paling membantu Anda punya di kotak peralatan Anda.
>> Ada hal-hal ton lebih yang dapat Anda lakukan dengan GDB,
jauh lebih banyak daripada yang dapat Anda lakukan dengan cetakan sederhana.
Lain kali program anda tidak melakukan apa yang Anda ingin,
coba jalankan GDB untuk mencari tahu apa yang terjadi di dalam.
Dengan sedikit latihan, Anda akan dapat menelusuri tepat di bug Anda dalam waktu singkat.
Nama saya adalah Nate Hardison. Ini adalah CS50.