Apa itu kesalahan segmentasi?

27

Di Ubuntu saya telah menghadapi kesalahan kesalahan segmentasi berkali-kali. Apa itu kesalahan segmentasi dan kapan itu terjadi?

Tachyons
sumber
1
Hanya untuk menutupinya: Saya memiliki masalah yang sama, sedangkan segfaults saya tidak dapat direproduksi dengan andal dan mereka datang dari (hampir) aplikasi acak. Ternyata ingatan saya kemungkinan besar rusak. Jadi, jika ada program yang menyebabkan segfault, orang mungkin harus melihat lebih dekat pada RAM.

Jawaban:

25

Kesalahan yang mengatakan kesalahan segmentasi (atau segfault , atau SIGSEGV ) di Ubuntu dan sistem operasi mirip Unix lainnya, atau mengatakan kesalahan perlindungan umum di Windows, adalah ketika suatu program mencoba mengakses bagian memori yang tidak dapat diakses, atau yang programnya dilarang mengakses. Kesalahan segmentasi adalah jenis crash program, yaitu, penghentian program yang tidak normal. Lihat artikel Wikipedia pada crash , perlindungan memori , kesalahan segmentasi , kesalahan perlindungan umum , dan SIGSEGV untuk informasi lebih lanjut (dan pemahaman yang lebih bertekstur topik daripada yang disajikan di sini).

Kesalahan segmentasi hampir selalu disebabkan oleh bug dalam program di mana ia terjadi. Saya menduga sebagian besar atau semua kesalahan segmentasi Anda terjadi dari aplikasi yang sama. Berikan detail lebih lanjut tentang keadaan di mana kesalahan segmentasi terjadi pada mesin Anda, dan program apa yang macet. Harap berikan juga teks lengkap dan tepat dari pesan kesalahan yang Anda terima dan pesan lain apa pun yang muncul sebelumnya. Ini harus memungkinkan kami untuk memberikan saran terperinci yang khusus untuk masalah Anda (bukan hanya informasi umum tentang kesalahan segmentasi).

Cara terbaik bagi Anda untuk memberikan informasi ini adalah dengan mengedit pertanyaan Anda untuk memasukkannya . Atau, jika Anda ingin pertanyaan ini hanya tentang kesalahan segmentasi secara umum, Anda dapat memposting pertanyaan baru untuk bertanya tentang apa yang secara spesifik menyebabkan kesalahan segmentasi Anda (jika Anda melakukan ini, pastikan untuk memberikan semua detail ini dalam pertanyaan baru Anda) .

Eliah Kagan
sumber
untungnya semua kesalahan segmentasi diperbaiki dengan memutakhirkan os :). Pertanyaan saya adalah tentang kesalahan segmentasi secara umum. Tidak untuk aplikasi tertentu.
Tachyons
@ Saya bukan lawan bicara saya sudah mengedit jawaban saya. (Saya tetap mempertahankan arahan untuk memberikan lebih banyak informasi, untuk kepentingan pengguna lain yang mengalami kesalahan segmentasi, meskipun saya tahu Anda tidak memerlukan bantuan khusus untuk itu sekarang.)
Eliah Kagan
Nah ini tentang kesalahan segmentasi dalam suatu aplikasi. Saya ingin bertanya tentang hal itu terjadi dalam program C ++ di mana sebagai program yang sama berjalan dengan baik di Windows atau Turbo C ++ (dalam anggur) (saya menggunakan anjuta di Linux). Dan ini hanya program dasar dan bukan aplikasi (Program seperti TREES , GRAPHS, dll)
Nirmik
Terima kasih. Tapi saya takut dalam sebagian besar kasus mengajukan pertanyaan tentang kesalahan segmentasi dalam aplikasi tidak aktif di sini. :)
Tachyons
@ Nirmik: mungkin itu adalah topik untuk stackoverflow :)
Tachyons
4

Kesalahan segmentasi disebabkan oleh bug dalam aplikasi. Secara teknis itu berarti aplikasi mencoba membaca atau menulis ke bagian memori yang bukan miliknya (atau tidak ada). Tentu saja dilarang membaca atau menulis ke memori orang lain dan ketika sistem (kernel) mendeteksi ini, itu akan memaksa aplikasi untuk berhenti.

Vojtech Trefny
sumber
0

Lewatlah sudah hari-hari ketika orang biasa melacak kode perakitan dan men-debug masalah. Abends, Dr Watson, Kesalahan segmentasi. Hari-hari hijau itu hilang.

Salah satu alasan untuk kesalahan segmentasi adalah ketika kode yang memiliki akses langsung ke memori gagal. Ketika sepotong kode mencoba mengakses segmen memori dari aplikasi yang berbeda, kesalahan segmentasi terjadi. Alokasi memori beberapa kali dipindahkan untuk memungkinkan blok memori yang berdekatan dan lebih besar dialokasikan. Ketika mencoba untuk memulihkan, kernel berusaha keras untuk menyimpan semua informasi memorinya ke file, keadaan saat ini dari semua aplikasi yang berjalan pada cpu dan statusnya (menjalankan instruksi terakhir) ke file dan mati. Ini juga akan mencoba untuk menyimpan sebanyak mungkin informasi pemulihan, dan menutup sebanyak mungkin file, sehingga hdd tidak mendapatkan tautan yang rusak.

Debug dan perbaiki jika Anda bisa memperbanyaknya. Jika Anda tidak dapat mereproduksinya, cukup bergandengan tangan, berlutut dan berdoa keras-keras agar Anda tidak melihatnya "secara teratur".

Siddharth
sumber
Segfault dapat dipicu dalam program apa pun yang ditulis dalam bahasa yang memungkinkan akses memori langsung. Mereka umumnya tidak akan merusak kernel.
Alex L.
@AlexL. itu akurat. Saya akan mengedit jawaban saya.
Siddharth
Saya harap saya telah mewakili pikiran saya dengan benar.
Siddharth
@AlexL. Bisakah Anda memeriksanya sekali lagi. Saya akan menghapusnya, jika masih belum akurat.
Siddharth
Ini lebih baik. Namun, (1) walaupun mungkin sangat jarang bagi suatu program untuk mengatur SIGSEGVhandler ke hal lain selain SIG_DFL(yang membuang inti dan keluar untuk a SIGSEGV) karena jika Anda mengakses memori yang seharusnya tidak ada maka ada sesuatu yang sudah sangat salah dan pemulihan mungkin tidak mungkin. (2) Inti akan dibuang hanya setelah proses dihentikan. (3) dump inti hanya mencakup memori dan register dari proses yang dibuang. (4) Proses lain, CPU dan kernal tidak terpengaruh oleh segfault dari proses lain.
Alex L.