Cara Menemukan Penyebab Kesalahan Segmentasi di C++

Cara Menemukan Penyebab Kesalahan Segmentasi Di C



Kesalahan segmentasi, juga dikenal sebagai kesalahan segmentasi, adalah jenis kesalahan yang terjadi ketika suatu program mencoba menjangkau bagian memori yang tidak boleh diakses oleh program tersebut. Ketika kesalahan segmentasi terjadi, sistem operasi menghentikan program untuk mencegahnya menyebabkan masalah lebih lanjut. Kesalahan ini biasanya menunjukkan bug atau kesalahan pemrograman dalam kode program seperti mengakses pointer yang tidak diinisialisasi, melakukan dereferensi pointer null, atau melampaui batas array.

Kesalahan segmentasi dapat menjadi tantangan untuk di-debug karena sering kali mengakibatkan error tanpa memberikan pesan kesalahan yang mendetail. Namun, alat seperti GDB (GNU Debugger) dapat membantu mengidentifikasi sumber kesalahan segmentasi dengan memeriksa status program dan pelacakan tumpukan pada saat kesalahan terjadi.

Penting untuk diperhatikan bahwa kesalahan segmentasi biasanya disebabkan oleh kesalahan pemrograman dan dianggap sebagai bug. Masalah tersebut harus diperbaiki dengan meninjau dan memperbaiki kode yang bermasalah. Penyebab umum kesalahan segmentasi meliputi:







  • Mendereferensi pointer null atau tidak diinisialisasi
  • Menulis atau membaca di luar batas array
  • Menggunakan memori yang sebelumnya telah dibatalkan alokasinya atau dilepaskan
  • Stack overflow atau tumpukan korupsi
  • Menggunakan variabel yang tidak diinisialisasi

Dengan memeriksa kode Anda secara cermat dan menggunakan alat debugging seperti GDB, Anda dapat mengidentifikasi dan memperbaiki kesalahan segmentasi, memastikan bahwa program Anda beroperasi dengan benar dan tidak mengalami kesalahan ini.



Debugger GDB

GDB (GNU Debugger) adalah alat debugging yang kuat yang membantu mengidentifikasi dan menganalisis masalah dalam program yang dikompilasi termasuk kesalahan segmentasi. Hal ini memungkinkan Anda memeriksa status program, memicu breakpoint, dan mengamati alur eksekusi.



Untuk menggunakan GDB secara efektif dalam men-debug kesalahan segmentasi, Anda perlu mengkompilasi program C++ dengan simbol debugging yang diaktifkan. Simbol-simbol ini mencakup informasi tambahan tentang struktur program, variabel, dan fungsi yang membantu dalam proses debugging.





Menemukan Kesalahan Segmentasi di C++ dengan GDB

Berikut contoh cuplikan kode yang menyebabkan kesalahan segmentasi:

#termasuk

ke dalam utama ( ) {

ke dalam * ptr = nullptr ;

* ptr = 5 ;

kembali 0 ;

}

Mari kita jelaskan dulu kodenya. Kemudian kita akan membahas langkah-langkah tentang menemukan kesalahan segmentasi pada kode sebelumnya.



Direktif praprosesor “#include ” menambahkan file header yang diperlukan yang menawarkan karakteristik aliran masukan dan keluaran dalam C++.

Di dalam fungsi main(), terdapat deklarasi variabel penunjuk “ptr” bertipe int*. Nilai “nullptr” digunakan sebagai inisialisasi penunjuk yang merupakan nilai penunjuk nol khusus yang menunjukkan bahwa ia tidak menunjuk ke mana pun lokasi memori yang valid.

Upaya dereferensi dilakukan dengan penunjuk nol “ptr” pada baris berikut yaitu “*ptr = 5;”. Dalam hal ini, karena “ptr” disetel ke “nullptr”, tidak ada lokasi memori yang valid untuk diakses.

Sekarang, kita akan membahas beberapa langkah yang perlu dilakukan untuk mengkompilasi program guna menemukan kesalahan segmentasi.

Langkah 1: Aktifkan Simbol Debugging

Untuk memulai, pastikan untuk mengkompilasi program C++ Anda dengan simbol debugging yang diaktifkan. Untuk memberikan informasi debug ke file yang dapat dieksekusi selama kompilasi, gunakan tanda “-g”. Pertimbangkan kasus di mana kita memiliki file C++ bernama “main.cpp”.

$ g++ -G utama.cpp -HAI utama

Langkah 2: Jalankan GDB

Setelah program dikompilasi dengan simbol debugging, jalankan GDB dengan meneruskan file yang dapat dieksekusi sebagai argumen.

$ gdb utama

Langkah 3: Mulai Program

Mulai program dengan mengetik “run” atau “r” pada prompt GDB:

$ ( gdb ) berlari

Program Anda kemudian akan mulai dijalankan.

Langkah 4: Identifikasi Kesalahan Segmentasi

Program terus berjalan hingga menemukan kesalahan segmentasi. Program kemudian berhenti berjalan, dan GDB menghasilkan pesan kesalahan.

Sebagai contoh: mari kita perhatikan kode yang telah dijelaskan sebelumnya di mana ketika kita mencoba untuk menetapkan nilai 5 ke lokasi memori yang ditunjuk oleh penunjuk nol, hal itu menghasilkan kesalahan segmentasi. Program segera berakhir pada baris dimana kesalahan segmentasi terjadi.

Saat menjalankan program ini dengan GDB, Anda akan melihat keluaran serupa sebagai berikut:

Output ini menunjukkan bahwa terjadi kesalahan segmentasi pada fungsi utama pada baris 5 file “main.cpp”.

Langkah 5: Periksa Stack Trace

Untuk mendapatkan lebih banyak wawasan tentang kesalahan segmentasi, Anda dapat memeriksa pelacakan tumpukan menggunakan perintah “backtrace” atau cukup “bt”. Perintah ini menampilkan urutan pemanggilan fungsi yang menyebabkan kerusakan.

$ ( gdb ) bt

Jejak tumpukan ditampilkan yang menunjukkan fungsi yang dipanggil sebelum kesalahan segmentasi:

Output ini memberitahu kita bahwa kesalahan segmentasi terjadi pada fungsi utama di baris 5 file “main.cpp”.

Langkah 6: Tetapkan Breakpoint

Untuk menyelidiki lebih lanjut, Anda dapat mengatur breakpoint pada baris kode tertentu untuk menghentikan eksekusi program pada titik tersebut. Hal ini memungkinkan Anda memeriksa status dan variabel program. Misalnya, untuk menyetel breakpoint pada baris 5 “main.cpp”, gunakan perintah “break” sebagai berikut:

$ ( gdb ) merusak main.cpp: 5

Ini menetapkan breakpoint pada baris 5 dari file “main.cpp”:

Langkah 7: Lanjutkan Eksekusi

Setelah mengatur breakpoint, lanjutkan eksekusi program menggunakan perintah “lanjutkan” atau cukup “c”:

$ ( gdb ) melanjutkan

Program terus berjalan hingga mencapai breakpoint.

Langkah 8: Periksa Variabel dan Kode

Setelah program berhenti di breakpoint, Anda dapat menggunakan berbagai perintah GDB untuk memeriksa variabel, menelusuri kode, dan menyelidiki penyebab kesalahan segmentasi.

Langkah 9: Keluar dari GDB

Setelah Anda menyelesaikan proses debug, Anda dapat keluar dari GDB menggunakan perintah “keluar”:

$ ( gdb ) berhenti

Ini memberikan gambaran dasar penggunaan GDB untuk menemukan kesalahan segmentasi dalam program C++. GDB menyediakan lebih banyak fitur dan perintah yang dapat membantu proses debug, dan Anda dapat merujuk ke dokumentasi GDB untuk informasi lebih mendalam.

Kesimpulan

Artikel ini menunjukkan pemanfaatan GDB untuk menemukan kesalahan segmentasi di C++. Kami menjelaskan kepada Anda langkah-langkah yang perlu diikuti. Langkah-langkah ini memberikan penjelasan komprehensif tentang cara menemukan kesalahan segmentasi di C++ menggunakan GDB. Dengan mengikuti langkah-langkah ini dan memanfaatkan fitur GDB, Anda dapat secara efektif menemukan dan men-debug sumber kesalahan segmentasi dalam program C++ Anda.