Çalışan uygulama “Segmentation Fault” ile bitiyor


Yanıtlar:


62

Bir segmentasyon hatası bellek erişim ihlali sonucudur. Program, kendisine tahsis edilenler dışındaki bir hafıza adresine gönderme yaptı ve işletim sistemi çekirdeği programı SIGSEGV ile öldürerek yanıt verdi.

Bu bir hatadır, çünkü erişilemez belleğe erişmeye çalışmanın bir anlamı yoktur (yapılamaz). Bununla birlikte, bu tür hataların, özellikle C ve C ++ gibi dillerde (birçok ortak uygulamayı hesaba katan) yapılması kolaydır. Programın kendisinde bir hatayı veya bağlantı verdiği bir kütüphaneyi belirtir. Hatayı bildirmek istiyorsanız (bunu yapın - bu yardımcı olur), seg arızasına yol açan olayların geri izini eklemek iyi bir fikirdir .

Bunu yapmak gdbiçin, önceden kurulu değilse herhangi bir linux dağıtımından edinilmesi gereken programı (GNU hata ayıklayıcı) içinde çalıştırabilirsiniz (paket sadece "gdb" olarak adlandırılır). Bozuk uygulamaya "brokenapp" adı verilirse:

gdb brokenapp

Telif hakkı ve lisans ile ilgili bir paragraf görünecek ve sonunda imleç ile ilgili bilgi istenecektir:

(gdb) _ 

Yazın runve isabet girin. Eğer argümanlar vermeniz gerekiyorsa (örn. -x --foo=bar whatever) Bunları ekleyin ( run -x --foo=bar whatever). Program ne yaparsa onu yapacak, çıktıyı göreceksiniz ve eğer etkileşime ihtiyacınız varsa (gdb içinde bir GUI dahil olmak üzere her türlü programı çalıştırabileceğinizi unutmayın). Genellikle segfaults olduğu noktada göreceksiniz:

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

Buradaki ikinci çıktı satırı sadece bir örnek. Şimdi bt("backtrace" için) yazın ve enter tuşuna basın. Daha uzun olsa da, böyle bir şey göreceksiniz:

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

Daha uzunsa, bir seferde yalnızca perdeli olacaksınız ve bir --More--mesaj olacak . Tamamlanana kadar vurmaya devam edin. Artık quitçıkış terminalinizde kalacak. Her şeyi baştan Program received signal SIGSEGVsona bir metin dosyasına kopyalayın ve uygulamanın hata izleyicisine bir hata raporu gönderin; Bunları çevrimiçi olarak arayarak bulabilirsiniz, örneğin "brokenapp hata raporu" - muhtemelen bir e-posta ile size bir cevap gönderilmesi için kaydolmanız gerekir. Sorunun tanımını, verdiğiniz tüm argümanları runvb. Ve geri izlemenin bir kopyasını ekleyin (çok uzun sürerse, hata izleme arayüzüne bir metin dosyası eklemek için bir yol olabilir). Ayrıca, bunun ne olduğunu biliyorsanız ( brokenapp --versionçalışabilir veya man sayfası bunun nasıl alınacağını gösterebilir), sürümü de ekleyin ,

Birisi umarım size geri dönmeyecek. Dosyalama hataları genellikle takdir edilir.


1
Bölümleme hatası, tercüman dillerinde de ortaya çıkabilir (bunun nedeni tercümanın kendisinde bulunan hatalar nedeniyle),
Braiam

Bu çok kullanışlı! İçeri girme olasılığı var mı? bir dur işareti koymak ve daha fazlasını öğrenmeye çalışmak?
Zloy Smiertniy

1
@ZloySmiertniy gdbyapar bir sürü şey . Bölüm 5.1
goldilocks

11

Bu, uygulamanın bir hatası olduğu anlamına gelir.

  • Son kullanıcıysanız, uygulamanın satıcısına başvurmalısınız.

    • Bir Linux dağıtımı ile geldiyse, bu dağıtım için bir hata raporu oluşturmalısınız.
    • Üçüncü taraf ticari olmayan uygulamalar için, hatayı yazara veya bu özel uygulama hata izleyicisine bildirmelisiniz. Genellikle uygulama sitesine göz atarak veya indirilen ikili / kaynak paketi ile yer bulabilirsin.
    • Ticari uygulamalar için desteğe başvurmalısınız.
  • Kendi uygulamanızsa, şunları yapabilirsiniz:

    1. çekirdek dosyaları etkinleştir: $ ulimit -c unlimited
    2. çöküşü yeniden oluşturun: $ ./yourapp
    3. gdb ile hata ayıklama kazası: $ gdb ./yourapp core

Çekirdek dosyalar da kendiniz dışındaki geliştiriciler için çok faydalı olacaktır - çarpışma anında programın tam durumunu içerirler; Bir hata raporu verecekseniz, ekleyin ve bazı durumlarda uygulamanızın ikili kodunu ekleyin. Hesap numaraları, şifreler ve benzeri kişisel verilerinizin, çarpışma anında programın hafızasında kalma ihtimalinin düşük olduğunu unutmayın. Çoğu durumda, kilitlenen iş parçacığının sadece geriye dönük olarak bildirilmesi, geliştiricilerin sorunu bulması için büyük yardımdır. Geri izlemek için çekirdek dosyasını debugger (like gdb executable corefile) ile yükleyebilirsiniz .


Microsoft'un iletişim kutusuna göre, satıcınıza yalnızca "sorun devam ederse" başvurmalısınız, aksi halde rahatsız etmeyin. Nadir kazalar gerçek hatalar değildir, sadece tekrarlanabilirler.
Kaz,

4
Benim gözlemime göre, Microsoft yazılımlarının kalitesi, UNIX yazılımıyla karşılaştırıldığında çoğu durumda düşüktür ve UNIX dünyasında insanların genellikle kendi kurallarına atıfta bulunmaması hoş bir şeydir.
gena2x
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.