Sekarang, ketika saya membuat kesalahan pemrograman dengan pointer di C, saya mendapatkan kesalahan segmentasi yang bagus, program saya macet dan debugger bahkan bisa memberi tahu saya di mana kesalahannya.
Bagaimana mereka melakukan itu di saat perlindungan memori tidak tersedia? Saya bisa melihat seorang programmer DOS mengotak-atik dan menabrak seluruh OS ketika dia melakukan kesalahan. Virtualisasi tidak tersedia, jadi yang bisa ia lakukan hanyalah memulai kembali dan mencoba lagi. Apakah benar-benar seperti itu?
Jawaban:
Ya, itulah yang terjadi. Pada sebagian besar sistem yang memiliki peta memori, lokasi 0 ditandai tidak valid, sehingga pointer nol dapat dengan mudah dideteksi, karena itu adalah kasus yang paling umum. Tetapi ada banyak kasus lain, dan mereka menyebabkan kekacauan.
Dengan risiko terdengar seperti kakek tua, saya harus menunjukkan bahwa fokus saat ini pada debugging bukan cara masa lalu. Banyak upaya yang dilakukan sebelumnya untuk menulis program yang benar, daripada menghapus bug dari program yang salah. Beberapa di antaranya adalah karena itu adalah tujuan kami, tetapi banyak karena alat membuat segalanya menjadi sulit. Cobalah menulis program Anda di atas kertas atau kartu yang dilubangi, bukan dalam IDE, dan tanpa manfaat dari debugger interaktif. Ini memberi Anda rasa untuk kebenaran.
sumber
Kembali di hari saya, kami tidak memiliki perlindungan memori dan semua bisnis yang manis! Kami menggunakan printf untuk menentukan di mana kami berada dalam program ini, dan kami menyukainya !
Meskipun dengan serius, biasanya itu berarti kami hanya lebih berhati-hati. Di mana malloc dipanggil, harus ada tempat lain yang bebas dalam program, dan pengecekan seperti itu sangat ketat karena dalam kasus masalah, seperti yang telah Anda jelaskan, kesalahan segmentasi bukanlah kesalahan yang membantu.
Dalam hal kesalahan seperti itu, yang terbaik yang bisa Anda lakukan adalah mencoba memahami ketika kesalahan segmentasi tersebut terjadi (menggunakan printf) dan, melihat kode, menentukan mengapa akses ke memori pada saat itu tidak valid dan bekerja mundur dari sana.
Pada dasarnya, hal yang sama terjadi hari ini, kecuali kami menggunakan debugger untuk menentukan kapan kesalahan terjadi, tetapi Anda masih harus memahami mengapa itu terjadi, dan itu tidak selalu sesederhana menemukan garis di mana kesalahan terjadi. Kesalahan menyebabkan kesalahan seperti reaksi berantai, dan jika Anda adalah seorang programmer C pada masa itu, Anda menghabiskan 20% dari waktu Anda mengkodekan dan sisanya menarik rambut Anda untuk memperbaiki bug.
sumber
yah ..
segfault adalah indikator yang sangat bagus bahwa ada sesuatu yang salah tetapi Anda masih harus menemukan akar masalahnya. Jadi, jika Anda mengajukan pertanyaan bagaimana Anda menemukan akar penyebab daripada jawabannya tidak jauh berbeda hari ini daripada sebelumnya. Tentu saja bahasa dan alat menjadi lebih mudah untuk dikerjakan tetapi motivasi umumnya sama:
Pada tingkat yang lebih abstrak, Anda memiliki tiga pendekatan: 1. bekerja dengan kode 2. melihat program saat berjalan 3. melihat hasilnya setelah melakukan sesuatu yang bodoh
btw kesalahan pointer tidak harus membuat segfault.
Sebagai seorang programmer Amiga saya menggunakan hampir semuanya. Dan ya memulai kembali di mana praktik umum.
sumber
Di IBM 360, menjalankan pekerjaan batch Fortran, kami biasa mendapatkan dump hex core. Tumpukan seperti itu bisa setebal satu inci tebal kertas printer hijau-putih lipat-kipas. Itu akan memberitahu apa register itu, dan dari sana kita bisa mundur dan mencari tahu apa yang sedang dilakukan program. Kami dapat menemukan setiap subrutin dan mencari tahu di mana ia menyimpan alamat pengirimnya, sehingga kami dapat melihat konteksnya. Ini akan membantu untuk memiliki daftar assembler program.
sumber
Suatu hari saya sedang mengerjakan perbaikan bug pada perangkat lunak Presentasi Windows 3.1 yang terkenal saat itu.
Saya memiliki bug yang, ketika itu terjadi, menyebabkan Blue Screen of Death.
Bug hanya terjadi ketika loop tertentu telah dieksekusi lebih dari 1000 kali. Saya menggunakan fitur-fitur canggih dari debugger untuk membiarkan break point melewati 1000 kali dan kemudian saya hati-hati melangkah melalui program. Setiap kali saya melangkah terlalu jauh atau melewatkan panggilan fungsi yang mengandung bug Windows Blue Screened.
Akhirnya, setelah beberapa hari bekerja, saya mempersempitnya ke fungsi yang kehabisan memori dan alih-alih menampilkan pesan kesalahan, menambahkan pesan kesalahan ke buffer. Dengan setiap iterasi berikutnya, ia menghancurkan lebih banyak memori hingga sesuatu yang penting ditimpa dan Windows dihancurkan.
Keterampilan debugging dan ketekunan adalah solusinya.
sumber