Saya ingin menambahkan bahwa debugger tidak selalu merupakan solusi sempurna, dan tidak harus selalu menjadi solusi masuk ke debugging. Berikut beberapa kasus saat debugger mungkin tidak berfungsi untuk Anda:
- Bagian dari program Anda yang gagal sangat besar (modularisasi yang buruk, mungkin?) Dan Anda tidak yakin harus mulai dari mana melangkah melalui kode. Melangkahi semua itu mungkin terlalu memakan waktu.
- Program Anda menggunakan banyak callback dan metode kontrol aliran non-linier lainnya, yang membuat debugger bingung saat Anda melewatinya.
- Program Anda multi-threaded. Atau lebih buruk lagi, masalah Anda disebabkan oleh kondisi balapan.
- Kode yang memiliki bug di dalamnya berjalan berkali-kali sebelum rusak. Ini bisa menjadi sangat bermasalah di loop utama, atau lebih buruk lagi, di mesin fisika, di mana masalahnya bisa berupa numerik. Bahkan menyetel breakpoint, dalam hal ini, hanya akan membuat Anda memukulnya berkali-kali, dengan bug tidak muncul.
- Program Anda harus berjalan secara real-time. Ini adalah masalah besar untuk program yang terhubung ke jaringan. Jika Anda menyiapkan breakpoint dalam kode jaringan Anda, ujung lainnya tidak akan menunggu Anda untuk melangkah maju, itu hanya akan menghabiskan waktu. Program yang mengandalkan jam sistem, misalnya game dengan frameskip, juga tidak jauh lebih baik.
- Program Anda melakukan beberapa bentuk tindakan merusak, seperti menulis ke file atau mengirim email, dan Anda ingin membatasi berapa kali Anda perlu menjalankannya.
- Anda dapat mengetahui bahwa bug Anda disebabkan oleh kesalahan nilai yang tiba di fungsi X, tetapi Anda tidak tahu dari mana nilai ini berasal. Harus menjalankan program, lagi dan lagi, mengatur breakpoints semakin jauh ke belakang, bisa menjadi masalah besar. Apalagi jika fungsi X dipanggil dari banyak tempat di seluruh program.
Dalam semua kasus ini, menghentikan program Anda secara tiba-tiba dapat menyebabkan hasil akhir berbeda, atau melangkah secara manual untuk mencari satu baris di mana bug disebabkan terlalu merepotkan. Ini sama-sama dapat terjadi baik bug Anda adalah perilaku yang salah, atau crash. Misalnya, jika kerusakan memori menyebabkan kerusakan, pada saat kerusakan terjadi, itu terlalu jauh dari tempat kerusakan memori pertama kali terjadi, dan tidak ada informasi berguna yang tersisa.
Jadi apa saja alternatifnya?
Paling sederhana hanyalah pencatatan dan pernyataan. Tambahkan log ke program Anda di berbagai titik, dan bandingkan apa yang Anda dapatkan dengan apa yang Anda harapkan. Misalnya, lihat apakah fungsi yang menurut Anda ada bug dipanggil. Lihat apakah variabel di awal metode sesuai dengan perkiraan Anda. Tidak seperti breakpoint, tidak masalah jika ada banyak baris log di mana tidak ada hal khusus yang terjadi. Anda cukup mencari melalui log sesudahnya. Setelah Anda mencapai garis log yang berbeda dari yang Anda harapkan, tambahkan lebih banyak di area yang sama. Persempit semakin jauh, hingga cukup kecil untuk dapat mencatat setiap baris di area yang disadap.
Pernyataan dapat digunakan untuk menjebak nilai yang salah saat terjadi, daripada setelah memiliki efek yang terlihat oleh pengguna akhir. Semakin cepat Anda menangkap nilai yang salah, semakin dekat Anda dengan garis yang memproduksinya.
Tes refaktor dan unit. Jika program Anda terlalu besar, mungkin bermanfaat untuk mengujinya satu kelas atau satu fungsi pada satu waktu. Berikan masukan, dan lihat keluarannya, dan lihat mana yang tidak seperti yang Anda harapkan. Mampu mempersempit bug dari seluruh program menjadi satu fungsi dapat membuat perbedaan besar dalam waktu debugging.
Jika terjadi kebocoran memori atau hentakan memori, gunakan alat yang sesuai yang dapat menganalisis dan mendeteksi ini pada waktu proses. Mampu mendeteksi di mana korupsi sebenarnya terjadi adalah langkah pertama. Setelah ini, Anda dapat menggunakan log untuk kembali ke tempat nilai yang salah dimasukkan.
Ingatlah bahwa debugging adalah proses mundur. Anda mendapatkan hasil akhirnya - bug - dan temukan penyebabnya, yang mendahuluinya. Ini tentang bekerja mundur dan, sayangnya, debugger hanya melangkah maju. Di sinilah logging dan analisis postmortem yang baik dapat memberi Anda hasil yang jauh lebih baik.