Saya, misalnya, hanya menambahkan kode debug (seperti pernyataan cetak) ketika saya mencoba menemukan bug. Dan begitu saya menemukannya, saya menghapus kode debug (dan menambahkan test case yang secara khusus menguji bug itu). Saya merasa itu mengacaukan kode asli dan karena itu tidak memiliki tempat di sana kecuali saya sedang debugging.
Bagaimana Anda melakukannya? Apakah Anda membiarkan kode debug di tempat, atau menghapusnya ketika usang (yang mungkin sulit untuk menilai kapan itu)?
Kode yang ditambahkan secara khusus untuk debugging harus dihapus dari perangkat lunak produksi.
Apakah ini penghapusan lengkap atau dimasukkan ke bagian kompilasi bersyarat (seperti dalam C / C ++ / C #) terserah Anda dan standar pengkodean Anda.
Ada sejumlah alasan untuk ini:
sumber
ChrisF dan Alaric keduanya memiliki poin yang valid; +1 untuk mereka. Saya dapat mengidentifikasi setidaknya 5 jenis kode debug yang saya gunakan.
Menggunakan log untuk membuang status sistem pada titik waktu tertentu.
Menggunakan log untuk titik pemeriksaan eksekusi.
Kode yang benar-benar memaksa kondisi tertentu menjadi benar, tetapi merusak perilaku normal. Contoh:
Verifikasi logging - Saya akan mengklasifikasikan ini sebagai logging verbose yang dapat digunakan untuk memvalidasi kebenaran perangkat lunak yang tidak boleh dimasukkan dalam produksi, seperti memvalidasi langkah-langkah individual dari algoritma misalnya.
Operasi logging - lihat posting Alaric . Itulah yang saya maksud dengan "operasi logging".
1, 2 dan 3 harus digunakan sepenuhnya. Sesuatu seperti 4 Saya mungkin akan mengkompilasi dengan syarat kode. Untuk 5, Alaric memiliki poin bagus tentang kemampuan untuk mematikan log secara dinamis. Itu mungkin membahas poin ChrisF dalam peluru keduanya untuk sebagian besar kasus.
sumber
1)
... dengan1.
... (sehingga pemformatan Markdown mengambilnya sebagai daftar) dan membuat indentasi kode contoh sebanyak 8 spasi (sekali lagi, sehingga Markdown mengambilnya sebagai contoh kode dalam daftar).Tergantung pada apa yang dilakukan kode. Beberapa kode yang digunakan untuk debugging dapat dibiarkan apa adanya, dan beberapa harus dihapus.
Kode yang memverifikasi kewarasan parameter dalam suatu metode tidak selalu berguna setelah kode berfungsi dengan baik, tetapi sering kali dipastikan bahwa kode tersebut terus berfungsi dengan baik.
Terkadang Anda menulis kode secara berbeda untuk memudahkan debug kode, misalnya menghitung nilai dan memasukkannya ke dalam variabel lokal, dan kemudian menggunakan variabel di baris berikutnya, yang membuatnya mudah untuk memeriksa hasil perhitungan ketika langkah tunggal melalui kode. Anda bisa menulis ulang kode untuk menggunakan nilai yang dihitung secara langsung, tetapi biaya menggunakan variabel lokal sangat kecil (jika ada sama sekali) sehingga ada sedikit alasan untuk menulis ulang kode. Juga, ada gunanya membiarkan kode tidak berubah setelah Anda mengujinya, selalu ada risiko kecil bahwa Anda memperkenalkan bug saat mengubahnya.
Kode yang Anda tambahkan hanya untuk melacak bug tertentu seringkali dapat dihapus setelah Anda menemukan bug.
sumber
Sekali waktu saya menggunakan banyak kode debug. Saya hampir seluruhnya menargetkan Windows, jadi ada banyak fungsi output string debug ini yang saya tidak ingat bagaimana mengeja lagi, jadi saya bisa menangkap jejak dengan program tertentu.
Beberapa kode debug tetap ada di tempat, hal-hal tertentu yang dimaksudkan untuk memberi panggilan bersarang. Namun, meskipun masalah string debug sebagian besar tidak akan terlihat pada sistem produksi, semuanya masih dilakukan di bawah kompilasi bersyarat.
Kenyataannya adalah, bagaimanapun, bahwa semua kode debug itu banyak upaya untuk sesuatu yang idealnya ditangani dengan cara yang berbeda - tentu saja menggunakan debugger. Pada saat itu, saya tidak terkesan dengan debugger Borland C ++. Alat ada di sana, tetapi mereka terlalu sering memberikan hasil yang menyesatkan, dan menggunakan debugger non-IDE (sering diperlukan) berarti menghafal tombol pintas, yang berarti gangguan dari pekerjaan yang sedang dihadapi.
Satu-satunya pengalaman debugging yang saya temukan lebih buruk adalah command-line GDB.
Menjadi seorang ahli dengan alat yang Anda gunakan setiap hari tentu saja penting - tetapi debugging tidak seharusnya menjadi sesuatu yang Anda lakukan setiap hari. Jika Anda sering menggunakan debugger, Anda akan baik-baik saja dengan mempelajari lusinan perintah dan / atau pintasan keyboard, yang tampaknya agak red-flag bagi saya.
Pada saat saya bekerja di Visual Studio 7, sudah jelas bahwa debugging bisa sangat praktis dan efektif. Jika Anda dapat melakukan debugging di Visual Studio (termasuk edisi ekspres), debugging sangat mudah. Tidak diragukan lagi jika Anda dapat menemukan ujung depan GUI / IDE yang tepat, GDB juga mudah dan efektif, meskipun saya belum melakukan pencarian itu.
Ada juga sesuatu yang bisa dikatakan untuk pengujian unit, dengan analisis cakupan menggunakan gcov. Semakin yakin bahwa Anda berada dalam perilaku perpustakaan Anda, semakin tidak perlu debugging Anda menjadi - dan semakin sering Anda membutuhkan debugger di tempat pertama. Dan menulis unit test adalah sesuatu yang cukup masuk akal yang harus Anda lakukan hampir setiap hari.
Tool yang tidak terduga penting = cmake, tool build yang memungkinkan saya untuk dengan mudah beralih antara membangun untuk GCC dan untuk VC ++, antara lain. Jadi saya bisa melakukan pengujian unit dan cakupan berbasis gcov menggunakan GCC, tetapi dengan mudah beralih ke VC ++ untuk menggunakan debugger.
sumber
Pandangan saya: Kode debug digunakan untuk membunuh bug di dalam kode yang saya tanya pada umumnya saya hapus seluruhnya. Kode debug digunakan untuk membunuh bug yang dihasilkan dari pasukan luar. Saya biasanya hanya berkomentar.
sumber
Jika bug berasal dari unit testing atau dari internal, kode debug bisa dihapus sama sekali. Tetapi jika bug berasal dari produksi, kode debug sebaiknya ada di dalam tag kompilasi. Menempatkannya di dalam tag kompilasi akan membantu pengembang lain untuk memahami bahwa kode ini hanya untuk tujuan debug.
sumber
Gunakan TDD , jadi kode pengujian Anda selalu memiliki tempat yang bahkan dipertahankan.
sumber