Segmentasyon hatası nedir?


27

Ubuntu'da segmentasyon hatası hatası ile birçok kez karşılaştım. Segmentasyon hatası nedir ve ne zaman ortaya çıkar?


1
Sadece örtbas etmek için: Benzer bir problem yaşadım, segfaults'larım güvenilir bir şekilde tekrarlanabilir değildi ve (neredeyse) rastgele uygulamalardan geliyorlardı. Muhtemelen hafızamın bozulduğunu öğrendim. Bu yüzden eğer herhangi bir program segfaultlara sebep olursa, RAM’e yakından bakılabilir.

Yanıtlar:


25

Bir hata söyleyerek segmentasyon hatası (ya segfault veya SIGSEGV Ubuntu ve içinde) Unix benzeri işletim sistemleri veya diyerek diğer genel koruma hatasına bir program girişimleri bir erişilemiyor belleğin bir kısmını veya hangi programa girmek için ne zaman Windows, olduğu erişim yasaktır. Bölümleme hatası, bir tür program çökmesidir, yani programın olağandışı bir şekilde sonlandırılmasıdır. Daha fazla bilgi için Vikipedi kazalarına , hafıza korumasına , segmentasyon hatasına , genel koruma hatasına ve SIGSEGV makalelerine bakın (ve konunun burada sunulandan daha dokulu bir şekilde anlaşılması).

Bir segmentasyon hatası, hemen hemen her zaman, oluştuğu programdaki bir hatadan kaynaklanır. Bölümleme hatalarınızın çoğunun veya tamamının aynı uygulamadan gerçekleştiğini tahmin ediyorum. Lütfen makinenizde hangi bölümlendirme hatalarının meydana geldiği ve hangi programın çökmekte olduğu hakkında daha fazla bilgi veriniz. Lütfen ayrıca, aldığınız hata mesajının tam metnini ve bundan önce görünen diğer mesajları da sağlayın. Bu, sorununuza özgü ayrıntılı bir öneride bulunmamızı mümkün kılmalıdır (bir segmentasyon hatasının ne olduğu hakkında genel bilgi yerine).

Bu bilgiyi sağlamanın en iyi yolu , sorunuzu içerecek şekilde düzenlemenizi sağlamaktır . Alternatif olarak, bu sorunun genel olarak bölümleme hatalarıyla ilgili olmasını istiyorsanız, bölümlendirme hatalarınızın özellikle neye neden olduğunu sormak için yeni bir soru yayınlayabilirsiniz (bunu yaparsanız, tüm bu ayrıntıları yeni sorunuza verdiğinizden emin olun). .


Neyse ki tüm segmentasyon hatası, os :) yükseltilerek düzeltildi. Benim sorum genel segmentasyon hatası ile ilgili. Belirli bir uygulama için değil.
Takyonlar

@ Ben usta değilim Ben cevabımı buna göre düzenledim. (Bölümleme hatası yaşayan diğer kullanıcıların yararına, şu anda onlarla özel bir yardıma ihtiyaç duymadığımı bilmeme rağmen, daha fazla bilgi sağlama talimatlarını
saklıyorum

Peki bu bir uygulamada bir segmentasyon hatası hakkında. Aynı programın Windows veya Turbo C ++ 'da (şarapta) mükemmel şekilde çalıştığı (Linux'ta anjuta kullanıyorum) olduğu gibi sormak istedim. Peki, bunlar sadece temel programlar değil, uygulamalar (TREES gibi programlar) ,
GRAPHS

Teşekkürler .Ama ben app segmentasyon hatası hakkında soru soran çoğu durumda korkarım burada offtopic. :)
Tachyons,

@Nirmik: muhtemelen yığın akışı için konudur :)
Tachyons

4

Segmentasyon hatasına, uygulamadaki bir hata neden olur. Teknik olarak bu, uygulamanın kendisine ait olmayan (ya da olmayan) belleğin bir bölümünü okumaya ya da yazmaya çalıştığı anlamına gelir. Elbette başkasının hafızasına okumak veya yazmak yasaktır ve sistem (çekirdek) bunu algıladığında, başvuruyu bırakmaya zorlar.


0

İnsanların montaj kodunu takip edip bir hata ayıklama yaptıkları günler geride kaldı. Abends, Dr Watson, Segmentasyon hatası. O yeşil günler gitti.

Bir bölümleme hatasının nedenlerinden biri, belleğe doğrudan erişimi olan kodun başarısız olmasıdır. Bir kod parçası farklı bir uygulamanın bellek bölümüne erişmeye çalıştığında, bölümlendirme hatası meydana gelir. Bellek tahsisleri, daha büyük bitişik hafıza bloklarının tahsis edilmesine izin vermek için bazı zamanlarda hareket ettirilir. Kurtarmaya çalışırken, çekirdek tüm bellek bilgilerini bir dosyaya, cpu üzerinde çalışan tüm uygulamaların mevcut durumunu ve durumlarını (son komut çalıştırması) bir dosyaya kaydetmeye ve ölmeye çalışır. Ayrıca, kurtarma bilgilerinin depolanmasını ve olabildiğince fazla dosyayı kapatmayı deneyecek, böylece hdd'nin bağlantıları koparmayacak.

Hata ayıklayın ve sık sık yeniden üretebiliyorsanız düzeltin. Eğer onu çoğaltamazsan, sadece ellerini birleştir, diz çök ve "düzenli olarak" görmemek için cehennem gibi dua et.


Segfaults, doğrudan belleğe erişim sağlayan bir dilde yazılmış herhangi bir programda tetiklenebilir. Genelde çekirdeği de çökmezler.
Alex L.

@AlexL. bu doğru. Cevabımı düzenleyeceğim.
Siddharth

Umarım düşüncelerimi doğru temsil etmişimdir.
Siddharth

@AlexL. Lütfen bir kez daha gözden geçirebilir misiniz? Hala doğru değilse, sileceğim.
Siddharth

Bu daha iyi. Yine de, (1) mümkün olsa da, bir programın SIGSEGVişleyiciyi SIG_DFL(çekirdeği döken ve SIGSEGVçıkacak olan) dışındaki bir şeye ayarlaması son derece nadirdir, çünkü belleğe erişiyorsanız, o zaman bir şey gitmemiş olmalısınız. yanlış ve kurtarma muhtemelen imkansızdır. (2) Çekirdek ancak işlem durdurulduktan sonra atılacak. (3) Çekirdek dökümü, yalnızca dökülmüş olan sürecin belleğini ve kayıtlarını içerir. (4) Diğer işlemler, CPU ve çekirdek, başka bir işlemin bir bölümünden etkilenmez.
Alex L.,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.