Çalıştırılması gereken şeyi yapmaması ve belirli bir noktada mesajdan ayrılması gereken bir komut satırı uygulamasına sahibim:
Segmentation fault
Ne anlama geliyor? Ne yapmalıyım?
Çalıştırılması gereken şeyi yapmaması ve belirli bir noktada mesajdan ayrılması gereken bir komut satırı uygulamasına sahibim:
Segmentation fault
Ne anlama geliyor? Ne yapmalıyım?
Yanıtlar:
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 gdb
iç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 run
ve 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 SIGSEGV
sona 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ı run
vb. 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.
gdb
yapar bir sürü şey . Bölüm 5.1
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.
Kendi uygulamanızsa, şunları yapabilirsiniz:
$ ulimit -c unlimited
$ ./yourapp
$ 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 .