Kesalahan: “GDB Tidak Dapat Mengakses Memori di Alamat” di C++

Kesalahan Gdb Tidak Dapat Mengakses Memori Di Alamat Di C



Debugging adalah bagian penting dari proses ketika mengembangkan aplikasi dalam C++ atau bahasa pemrograman lainnya. Membuat aplikasi dalam C++ tidaklah mudah; ini melibatkan keterampilan struktur data yang baik, keterampilan memperbaiki bug, dan mengelola alat debugging. GDB, GNU Debugger, adalah alat efisien yang membantu pengembang mengidentifikasi dan menyelesaikan kesalahan dalam kode mereka. GDB adalah alat yang sangat sederhana dan berguna yang membantu pengembang menemukan dan memperbaiki bug kode.

Namun, saat menggunakan GDB, Anda mungkin mengalami kesalahan “kesalahan: GDB tidak dapat mengakses memori di alamat”. Kesalahan ini dapat membingungkan dan mempersulit proses debug. Artikel ini difokuskan untuk mengidentifikasi mengapa kesalahan ini terjadi dan melihat beberapa contoh kode yang membantu kami memahami cara mengatasi kesalahan ini.

Contoh 1:

Mari kita lihat contoh kode pertama yang, setelah dieksekusi, menghasilkan kesalahan “GDB tidak dapat mengakses memori di alamat”. Pertama, kita melihat kodenya. Selanjutnya kita akan melihat penjelasannya baris demi baris.







#termasuk
menggunakan ruang nama std ;
ke dalam utama ( ruang kosong ) {
ke dalam * P ;
cout << * P ;
}

Program dimulai dengan deklarasi direktif praprosesor “#include ” dan menggunakan “namespace std” yang penting untuk disertakan dalam program agar dapat menggunakan fungsi input dan output standar. Setelah itu, muncul titik masuk utama yaitu “int main(void);”. Baris ini menyatakan titik awal program.



Di dalam fungsi utama, variabel penunjuk “*p” dideklarasikan. Di sini, variabel “p” tidak diinisialisasi. Oleh karena itu, ini tidak menunjuk ke lokasi memori tertentu yang dicadangkan untuk bilangan bulat. Baris ini menyebabkan kesalahan yang akan kami atasi nanti. Pada baris berikutnya, kami mencoba mencetak nilai variabel “*p” menggunakan pernyataan “cout”.



Karena variabel “p” adalah penunjuk bertipe integer, tanda bintang “*” digunakan untuk melakukan dereferensi. Artinya, nilainya berada pada lokasi memori yang ditunjuknya. Namun, karena penunjuk “p” tidak diinisialisasi dan tidak menunjuk ke lokasi tertentu dan valid, mendereferensi penunjuk akan menghasilkan perilaku tidak terdefinisi. Oleh karena itu, hal ini menghasilkan berbagai jenis kesalahan tergantung pada sistem dan kompiler. Karena kita menggunakan kompiler GDB untuk men-debug dan menjalankan program ini, debugger akan memunculkan kesalahan berikut. Kesalahannya ditampilkan dalam cuplikan keluaran:





Seperti yang Anda lihat di output, debugger tidak dapat mengakses memori. Program ini melakukan dereferensi pada pointer yang tidak diinisialisasi, yang merupakan alasan utama perilaku tidak terdefinisi ini. Sekarang, mari kita lihat bagaimana kita bisa mengatasi masalah ini. Kode yang benar diberikan berikut ini. Silakan melihatnya dan kami akan menjelaskan cara kami memperbaiki bug pada kode:



#termasuk
menggunakan ruang nama std ;
ke dalam utama ( ruang kosong ) {
ke dalam val = 5 ;
ke dalam * P = & val ;
cout << 'Nilainya = ' << * P ;

}

Seperti yang Anda lihat, kode dimodifikasi dengan memasukkan “int val =5;” penyataan. Baris ini mendeklarasikan variabel integer bernama “val” dan menginisialisasinya dengan nilai “5”. Baris berikutnya, “int *p = &val;”, mendeklarasikan variabel penunjuk “*p” dan diinisialisasi untuk menunjuk ke alamat variabel “val”. Sebelumnya, penunjuk “*p” tidak menunjuk ke alamat memori mana pun yang menyebabkan “tidak dapat mengakses memori di alamat 0x0”.

Untuk mengatasi masalah ini, variabel “var” dideklarasikan, diinisialisasi, dan ditetapkan ke penunjuk “*p”. Sekarang, penunjuk “*p” menunjuk ke alamat variabel “val” saat operator “&” mengambil alamat “val” dan menugaskannya ke “p”. Sekali lagi, pernyataan “cout” digunakan untuk mencetak nilai pointer “*p”. Lihat cuplikan keluaran berikut untuk melihat nilai “val” yang diakses oleh penunjuk “*p”:

Seperti yang dapat Anda amati, kesalahan telah teratasi dan nilai “5” diinisialisasi sejak variabel “val” dicetak dengan memanggil penunjuk “*p” valribale.

Contoh 2:

Mari kita perhatikan contoh lain yang menjelaskan cara mengatasi kesalahan “GDB tidak dapat mengakses memori di alamat” dalam program kode C++. Kode diberikan berikut ini untuk referensi Anda. Coba lihat:

#termasuk
ke dalam utama ( ) {
ke dalam * P = baru ke dalam [ limabelas ] ;
menghapus [ ] P ;
std :: cout << P [ 2 ] << std :: akhir ;
kembali 0 ;
}

Salah satu skenario paling umum yang dihadapi pengembang saat memprogram dengan pointer adalah alokasi memori yang salah atau tidak tepat. GDB menghasilkan kesalahan setiap kali terjadi kesalahan alokasi dan dealokasi memori dalam program C++.

Mengingat contoh kode sebelumnya, pointer “*p” diinisialisasi dengan int[15] baru. Pernyataan ini secara dinamis mengalokasikan array yang terdiri dari 15 bilangan bulat menggunakan operator baru. Variabel penunjuk “*p” menyimpan alamat memori array.

Dalam pernyataan berikut, “delete[] p;,” menyatakan bahwa memori telah dibatalkan alokasinya menggunakan perintah delete[]. Perintah delete[] membatalkan alokasi memori yang dialokasikan sebelumnya dari penunjuk “*p” yang berarti bahwa penggunaan sistem lain dapat mengalokasikan lagi blok memori yang dialokasikan sebelumnya. Saat kita mencoba mencetak nilai variabel “*p” menggunakan pernyataan “cout”, kita akan mendapatkan kesalahan akses memori seperti yang terlihat pada keluaran berikut:

Hal yang perlu diingat di sini adalah pesan kesalahan sebenarnya mungkin sedikit berbeda tergantung pada versi dan sistem GDB Anda. Namun “kesalahan: GDB tidak dapat mengakses memori di lokasi” dan kesalahan yang diberikan pada cuplikan sebelumnya adalah sama. Untuk mengatasi kesalahan ini, kita cukup menggeser perintah delete[] setelah pernyataan “cout”. Lihat kode yang dimodifikasi berikut ini:

#termasuk
ke dalam utama ( ) {
ke dalam * P = baru ke dalam [ limabelas ] ;
untuk ( ke dalam Saya = 0 ; Saya < limabelas ; ++ Saya ) {
P [ Saya ] = Saya * 2 - 5 + 8 ;
std :: cout << 'P[' << Saya << '] = ' << P [ Saya ] << std :: akhir ;
}
menghapus [ ] P ;
kembali 0 ;
}

Di sini, Anda dapat melihat bahwa kami menginisialisasi array dengan nilai yang dihitung pada saat run time, dan kami mencetak semua nilai loop menggunakan loop “for”. Hal terpenting yang perlu diperhatikan di sini adalah pergeseran pernyataan delete[]; sekarang dipanggil setelah mendapatkan semua nilai array yang telah menghilangkan kesalahan akses memori. Lihat hasil akhir kode berikut ini:

Kesimpulan

Kesimpulannya, kesalahan “kesalahan: GDB tidak dapat mengakses memori di alamat” biasanya menunjukkan masalah terkait memori dalam kode C++. Artikel ini membahas beberapa skenario umum yang memicu kesalahan ini untuk menjelaskan kapan dan bagaimana kesalahan ini dapat diselesaikan. Ketika kesalahan ini terjadi pada kode, penting untuk meninjaunya secara cermat dengan memperhatikan variabel penunjuk, alokasi memori, array, dan struktur.

Selain itu, fitur seperti breakpoint yang disediakan oleh GDB dapat membantu menemukan kesalahan saat melakukan debug program. Fitur-fitur ini dapat membantu dalam menunjukkan dengan tepat lokasi kesalahan terkait memori. Dengan mengatasi masalah ini secara proaktif, pengembang dapat meningkatkan stabilitas dan keandalan aplikasi C++ mereka.