Apakah SEGV_MAPERR itu?

Jawaban:

197

Ada dua jenis SEGV yang umum , yang merupakan kesalahan akibat akses memori yang tidak valid:

  1. Sebuah halaman diakses dengan izin yang salah. Misalnya, ini hanya-baca tetapi kode Anda mencoba menulis padanya. Ini akan dilaporkan sebagai SEGV_ACCERR .
  2. Halaman yang diakses bahkan tidak dipetakan ke dalam ruang alamat aplikasi sama sekali. Hal ini sering kali terjadi akibat dereferensi penunjuk nol atau penunjuk yang rusak dengan nilai integer kecil. Ini dilaporkan sebagai SEGV_MAPERR .

Dokumentasi semacam (kode sumber Linux yang diindeks) untuk SEGV_MAPERR ada di sini: http://lxr.free-electrons.com/ident?i=SEGV_MAPERR .

ahcox
sumber
8
Mengapa stackoverflow.com/a/1000010/358475 ditandai sebagai jawaban jika yang ini lebih lengkap dan bermanfaat?
OldPeculier
2
Pertanyaan dan jawaban lainnya jauh lebih tua dari jawaban saya. Saya mengedit jawaban lain untuk memperbaikinya setidaknya.
ahcox
Menarik untuk mengetahui keadaan yang membedakan ini dari jenis pengecualian EXC_BAD_ACCESS. misalnya apakah halaman dipetakan tetapi tidak dialokasikan (/ baru-baru ini dibatalkan alokasinya)?
Bobjt
6
Salah satu contohnya SEGV_MAPERRadalah stack overflow (no pun intended). : D
Antti Haapala
40

Ini kesalahan segmentasi. Kemungkinan besar masalah penunjuk yang menjuntai, atau semacam buffer overflow.

SIGSSEGV adalah sinyal yang menghentikannya berdasarkan masalah, kesalahan segmentasi.

Periksa petunjuk yang menjuntai serta masalah luapan.

Mengaktifkan core dumps akan membantu Anda menentukan masalahnya.

Sev
sumber