Jika Anda kode dalam C, Objective-C atau C ++ Anda dapat menggunakan CLang Static Analyzer untuk mengkritik sumber Anda tanpa benar-benar menjalankannya.
Ada beberapa alat debugging memori yang tersedia: ValGrind, Guard Malloc pada Mac OS X, Electric Fence pada * NIX.
Beberapa lingkungan pengembangan menyediakan opsi untuk menggunakan pengalokasi memori debug, yang melakukan hal-hal seperti mengisi halaman yang baru dialokasikan dan halaman yang baru dibebaskan dengan sampah, mendeteksi pembebasan pointer yang tidak terisi, dan menulis beberapa data sebelum dan setelah setiap heap block, dengan debugger menjadi disebut jika pola diketahui dari data itu pernah berubah.
Beberapa pria di Slashdot mengatakan dia mendapatkan banyak nilai dari satu baris sumber baru dalam debugger. "Itu dia," katanya. Saya tidak selalu mengikuti sarannya, tetapi ketika saya memilikinya sangat membantu saya. Bahkan jika Anda tidak memiliki test case yang merangsang jalur kode yang tidak umum, Anda dapat mengubah variabel dalam debugger Anda untuk mengambil jalur tersebut, katakan dengan mengalokasikan sebagian memori, kemudian menggunakan debugger untuk mengatur pointer baru Anda ke NULL alih-alih alamat memori, kemudian melangkah melalui penangan kegagalan alokasi.
Gunakan pernyataan - makro pernyataan () di C, C ++ dan Objective-C. Jika bahasa Anda tidak memberikan fungsi yang tegas, tulis sendiri.
Gunakan penegasan secara bebas, lalu simpan di kode Anda. Saya sebut menegaskan () "Tes yang terus menguji". Saya menggunakannya paling umum untuk memeriksa prasyarat pada titik masuk sebagian besar fungsi saya. Itu salah satu bagian dari "Programming by Contract", yang dibangun ke dalam bahasa pemrograman Eiffel. Bagian lainnya adalah postconditions, yaitu, menggunakan assert () pada function return points, tetapi saya menemukan bahwa saya tidak mendapatkan jarak tempuh sebanyak itu sebagai prasyarat.
Anda juga dapat menggunakan penegasan untuk memeriksa invarian kelas. Meskipun tidak ada kelas yang benar-benar diperlukan untuk memiliki invarian, kelas yang dirancang paling masuk akal memang memilikinya. Kelas invarian adalah suatu kondisi yang selalu benar selain di dalam fungsi anggota yang mungkin sementara menempatkan objek Anda ke keadaan tidak konsisten. Fungsi tersebut harus selalu mengembalikan konsistensi sebelum kembali.
Dengan demikian setiap fungsi anggota dapat memeriksa invarian saat masuk dan keluar, dan kelas dapat mendefinisikan fungsi yang disebut CheckInvariant yang dapat dipanggil kode lain kapan saja.
Gunakan alat cakupan kode untuk memeriksa baris mana dari sumber Anda yang benar-benar diuji, kemudian rancang tes yang merangsang jalur yang tidak diuji. Misalnya Anda dapat memeriksa penangan memori rendah dengan menjalankan aplikasi Anda di dalam VM yang dikonfigurasi dengan sedikit memori fisik, dan tidak ada file swap atau yang sangat kecil.
(Untuk beberapa alasan saya tidak pernah tahu soal rahasia, sementara BeOS dapat berjalan tanpa file swap, itu sangat tidak stabil seperti itu. Dominic Giampaolo, yang menulis sistem file BFS, mendesak saya untuk tidak menjalankan BeOS tanpa swap. Saya tidak lihat mengapa itu penting, tetapi itu pasti semacam artefak implementasi.)
Anda juga harus menguji respons kode Anda terhadap kesalahan I / O. Cobalah menyimpan semua file Anda di jaringan yang dibagi, kemudian lepaskan kabel jaringan Anda saat aplikasi Anda memiliki beban kerja yang tinggi. Demikian pula, lepaskan kabel - atau matikan nirkabel Anda - jika Anda berkomunikasi melalui jaringan.
Satu hal yang menurut saya sangat menyebalkan adalah situs web yang tidak memiliki kode Javascript yang kuat. Halaman Facebook memuat lusinan file Javascript kecil, tetapi jika salah satu di antaranya gagal diunduh, seluruh halaman akan rusak. Harus ada beberapa cara baik untuk memberikan toleransi kesalahan, katakanlah dengan mencoba kembali unduhan, atau untuk memberikan semacam fallback yang masuk akal ketika beberapa skrip Anda tidak mengunduh.
Coba bunuh aplikasi Anda dengan debugger atau dengan "kill -9" di * NIX saat itu tepat di tengah penulisan file yang besar dan penting. Jika aplikasi Anda dirancang dengan baik, seluruh file akan ditulis atau tidak akan ditulis sama sekali, atau mungkin jika hanya ditulis sebagian, apa yang ditulis tidak akan rusak, dengan data apa yang disimpan dapat sepenuhnya digunakan oleh aplikasi setelah membaca kembali file.
database selalu memiliki I / O disk yang toleran terhadap kesalahan, tetapi hampir tidak ada jenis aplikasi lain yang melakukannya. Sementara filesystem journal mencegah kerusakan filesystem jika terjadi kegagalan daya atau crash, mereka tidak melakukan apa-apa untuk mencegah korupsi atau hilangnya data pengguna akhir. Itu adalah tanggung jawab aplikasi pengguna, tetapi hampir tidak ada yang lain selain database yang menerapkan toleransi kesalahan.