Cara Mencari Punca Kerosakan Segmentasi dalam C++

Cara Mencari Punca Kerosakan Segmentasi Dalam C



Ralat segmentasi, juga dikenali sebagai ralat segmentasi, ialah sejenis ralat yang berlaku apabila program cuba mencapai bahagian memori yang tidak dibenarkan untuk diakses. Apabila kesalahan pembahagian berlaku, sistem pengendalian menamatkan program untuk mengelakkannya daripada menyebabkan isu selanjutnya. Ralat ini biasanya menunjukkan pepijat atau ralat pengaturcaraan dalam kod atur cara seperti mengakses penuding yang tidak dimulakan, membatalkan rujukan penunjuk nol atau melangkaui sempadan tatasusunan.

Kesalahan pembahagian boleh mencabar untuk nyahpepijat kerana ia sering mengakibatkan ranap tanpa memberikan mesej ralat terperinci. Walau bagaimanapun, alatan seperti GDB (GNU Debugger) boleh membantu mengenal pasti punca kesalahan segmentasi dengan memeriksa keadaan program dan surih tindanan pada masa ralat.

Adalah penting untuk ambil perhatian bahawa kesalahan pembahagian biasanya disebabkan oleh ralat pengaturcaraan dan dianggap sebagai pepijat. Ia harus diperbaiki dengan menyemak dan membetulkan kod yang bermasalah. Penyebab umum kerosakan segmentasi termasuk:







  • Menyahrujuk penunjuk yang batal atau tidak dimulakan
  • Menulis atau membaca di luar had tatasusunan
  • Menggunakan memori yang sebelum ini telah dialokasikan atau dikeluarkan
  • Limpahan timbunan atau timbunan rasuah
  • Menggunakan pembolehubah yang tidak dimulakan

Dengan memeriksa kod anda dengan teliti dan menggunakan alat penyahpepijatan seperti GDB, anda boleh mengenal pasti dan membetulkan ralat pembahagian, memastikan program anda beroperasi dengan betul dan tidak menghadapi ralat ini.



Penyahpepijat GDB

GDB (GNU Debugger) ialah alat penyahpepijatan yang berkuasa yang membantu mengenal pasti dan menganalisis isu dalam atur cara yang disusun termasuk kesalahan pembahagian. Ia membolehkan anda memeriksa keadaan program, mencetuskan titik putus dan memerhati aliran pelaksanaan.



Untuk menggunakan GDB dengan berkesan untuk menyahpepijat kesalahan segmentasi, anda perlu menyusun atur cara C++ anda dengan simbol nyahpepijat yang didayakan. Simbol ini termasuk maklumat tambahan tentang struktur program, pembolehubah dan fungsi yang membantu dalam proses penyahpepijatan.





Mencari Kerosakan Segmentasi dalam C++ dengan GDB

Berikut ialah contoh coretan kod yang menyebabkan ralat pembahagian:

#include

int utama ( ) {

int * ptr = nullptr ;

* ptr = 5 ;

kembali 0 ;

}

Mari kita jelaskan dahulu kod tersebut. Kemudian, kita akan membincangkan dalam langkah-langkah tentang mencari kesalahan segmentasi dalam kod sebelumnya.



Arahan prapemproses “#include ” menambah fail pengepala yang diperlukan yang menawarkan input serta ciri aliran output dalam C++.

Di dalam fungsi main(), terdapat pengisytiharan pembolehubah penunjuk 'ptr' jenis int*. Nilai 'nullptr' digunakan sebagai permulaan penuding yang merupakan nilai penuding nol khas yang menunjukkan bahawa ia tidak menunjuk kepada mana-mana lokasi memori yang sah.

Percubaan penyahrujukan dibuat dengan penuding nol 'ptr' dalam baris berikut iaitu '*ptr = 5;'. Dalam kes ini, memandangkan 'ptr' ditetapkan kepada 'nullptr', tiada lokasi memori yang sah untuk diakses.

Sekarang, kita akan membincangkan beberapa langkah yang perlu diguna pakai untuk menyusun atur cara untuk mencari kesalahan segmentasi.

Langkah 1: Dayakan Simbol Penyahpepijatan

Untuk memulakan, pastikan anda menyusun atur cara C++ anda dengan simbol nyahpepijat yang didayakan. Untuk memberikan maklumat penyahpepijatan kepada fail boleh laku semasa penyusunan, gunakan bendera '-g'. Pertimbangkan kes di mana kami mempunyai fail C++ yang dipanggil 'main.cpp'.

$ g++ -g main.cpp -O utama

Langkah 2: Jalankan GDB

Setelah program disusun dengan simbol penyahpepijatan, jalankan GDB dengan menghantar fail boleh laku sebagai hujah.

$ gdb utama

Langkah 3: Mulakan Program

Mulakan program dengan menaip 'run' atau 'r' pada gesaan GDB:

$ ( gdb ) lari

Program anda kemudiannya akan mula dilaksanakan.

Langkah 4: Kenal pasti Kerosakan Segmentasi

Program ini terus berjalan sehingga ia menghadapi kesalahan pembahagian. Program ini kemudian berhenti berjalan, dan GDB menghasilkan mesej ralat.

Sebagai contoh: mari kita pertimbangkan kod yang dijelaskan sebelum ini di mana apabila kita cuba memberikan nilai 5 ke lokasi memori yang ditunjuk oleh penuding nol, ia mengakibatkan kesalahan pembahagian. Program ini ditamatkan serta-merta pada baris di mana kesalahan pembahagian berlaku.

Apabila menjalankan program ini dengan GDB, anda akan melihat output yang serupa dengan yang berikut:

Output ini menunjukkan bahawa kesalahan pembahagian berlaku dalam fungsi utama pada baris 5 fail 'main.cpp'.

Langkah 5: Periksa Jejak Tindanan

Untuk mendapatkan lebih banyak cerapan tentang kesalahan pembahagian, anda boleh memeriksa surih tindanan menggunakan perintah 'jejak belakang' atau hanya 'bt'. Perintah ini memaparkan urutan panggilan fungsi yang membawa kepada ranap sistem.

$ ( gdb ) bt

Surih tindanan dipaparkan yang menunjukkan fungsi yang dipanggil sebelum kesalahan pembahagian:

Output ini memberitahu kami bahawa kesalahan pembahagian berlaku dalam fungsi utama pada baris 5 fail 'main.cpp'.

Langkah 6: Tetapkan Titik Putus

Untuk menyiasat lebih lanjut, anda boleh menetapkan titik putus pada baris kod tertentu untuk menghentikan pelaksanaan program pada titik tersebut. Ini membolehkan anda memeriksa keadaan dan pembolehubah program. Contohnya, untuk menetapkan titik putus pada baris 5 'main.cpp', gunakan arahan 'break' seperti berikut:

$ ( gdb ) rehat main.cpp: 5

Ini menetapkan titik putus pada baris 5 fail 'main.cpp':

Langkah 7: Sambung semula Pelaksanaan

Selepas menetapkan titik putus, sambung semula pelaksanaan program menggunakan arahan 'teruskan' atau hanya 'c':

$ ( gdb ) teruskan

Program ini terus berjalan sehingga mencapai titik putus.

Langkah 8: Periksa Pembolehubah dan Kod

Setelah program berhenti pada titik putus, anda boleh menggunakan pelbagai arahan GDB untuk memeriksa pembolehubah, melangkah melalui kod dan menyiasat punca kesalahan segmentasi.

Langkah 9: Keluar dari GDB

Sebaik sahaja anda menyelesaikan penyahpepijatan, anda boleh keluar dari GDB menggunakan arahan 'berhenti':

$ ( gdb ) berhenti

Ini memberikan gambaran keseluruhan asas menggunakan GDB untuk mencari ralat pembahagian dalam program C++. GDB menyediakan lebih banyak ciri dan perintah yang boleh membantu dengan penyahpepijatan, dan anda boleh merujuk kepada dokumentasi GDB untuk mendapatkan maklumat yang lebih mendalam.

Kesimpulan

Artikel ini menunjukkan penggunaan GDB untuk mencari kesalahan segmentasi dalam C++. Kami menerangkan kepada anda langkah-langkah yang perlu diikuti. Langkah-langkah ini memberikan penjelasan komprehensif tentang cara mencari kesalahan segmentasi dalam C++ menggunakan GDB. Dengan mengikuti langkah-langkah ini dan menggunakan ciri GDB, anda boleh mengesan dan menyahpepijat sumber kerosakan segmentasi dalam program C++ anda dengan berkesan.