Nasıl segfault çekirdeği günlük bir mesajı okumak mı
Bu çok basit bir soru, am kern.log
aşağıdaki segfault hata üretir bir uygulama hata ayıklamak için çalışıyorum
kernel: myapp[15514]: segfault at 794ef0 ip 080513b sp 794ef0 error 6 in myapp[8048000 24000]
Burada benim sorular:
Orada segfault diff hata sayıların ne olduğu konusunda herhangi bir belge, bu durumda hata 6, 4, 5 hata gördüm
Bilgi anlamı
at bf794ef0 ip 0805130b sp bf794ef0 and myapp[8048000 24000]
nedir?
Şimdiye kadar semboller ile derlemek için başardı, ve x 0x8048000 24000
ben ne zaman bir sembol verir, bunu yapmanın doğru yolu nedir? Benim şimdiye kadar varsayımlar şunlardır:
- sp = işaretçi yığını?
- Yönerge işaretçisi = ıp
- = ??? at?
- [8048000 24000] = sembol Adres uygulamam?
CEVAP
Benim sınırlı bilgiye dayanarak, varsayımlar doğru.
sp
= işaretçi yığınıip
= Yönerge işaretçisi- 6* = *Adres
Eğer sorun hata ayıklama olsam bir çekirdek dökümü üretmek veya stack backtrace Bir günlük kazası için bu kodu değiştirmek istiyorum. Ayrıca bu program altında çalıştırabilirsiniz (veya takmak) GDB.
Hata kodu sadece sayfa hataları için mimari Hata Kodu ve Mimarlık özel görünüyor. Genellikle çekirdek kaynağı arch/*/mm/fault.c
belgelenmiştir. Linux/arch/i386/mm/fault.c
kopyamın hata_kodu için: aşağıdaki tanım vardır
- bit 0 == 0 hayır Sayfa, 1 bulundu koruma hatası anlamına gelir
- 1 == 0, 1 demek okumak demek karalayacaksınız
- bit 2 == 0 anlamına gelir çekirdek, 1 kullanıcı modu anlamına gelir
Linux/arch/x86_64/mm/fault.c
kopyamın aşağıdaki ekler:
- bit 3 == 1 hatası talimat getirme anlamına geliyor
Nasıl ben zaten Subversion işlenen bir...
Nasıl sadece bir kullanıcının git bir ...
Nasıl derleme bağlama hatası günlük (F...
Nasıl Node.js çevre değişkeni okumak i...
Nasıl hat Java kullanarak büyük metin ...