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:
#termasukke 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
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 utamaLangkah 2: Jalankan GDB
Setelah program dikompilasi dengan simbol debugging, jalankan GDB dengan meneruskan file yang dapat dieksekusi sebagai argumen.
$ gdb utamaLangkah 3: Mulai Program
Mulai program dengan mengetik “run” atau “r” pada prompt GDB:
$ ( gdb ) berlariProgram 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 ) btJejak 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: 5Ini 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 ) melanjutkanProgram 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 ) berhentiIni 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.