"EXC_I386_GPFLT" istisna kodunun anlamı nedir?


117

İstisna kodunun anlamı nedir EXC_I386_GPFLT?

Anlamı duruma göre değişiyor mu?

Bu durumda, EXC_BAD_ACCESSistisna kodlu istisna türünden bahsediyorumEXC_I386_GPFLT

Program, cblas_zgemm()BLAS kitaplığı ile ilgilenen Xcode 5.0.1'de geliştirilmiştir . (Pekala, önemli değil sanırım ...)

Çok teşekkür ederim!

Yanıtlar:


112

EXC_I386_GPFLT, kesinlikle "Genel Koruma hatası" na atıfta bulunuyor; bu, x86'nın size "yapmanıza izin verilmeyen bir şey yaptığınızı" söylemesinin yolu budur. Genellikle bellek sınırları dışında eriştiğiniz anlamına GELMEZ, ancak kodunuzun sınırların dışına çıkması ve bir tür koruma ihlali oluşturacak şekilde kötü kod / verilerin kullanılmasına neden olması olabilir.

Ne yazık ki, daha fazla bağlam olmadan sorunun tam olarak ne olduğunu anlamak zor olabilir, 2005 tarihli AMD64 Programcı El Kitabı, Cilt 2'de listelenen 27 farklı neden var - tüm hesaplara göre, muhtemelen 8 yıl sonra birkaçını eklemiş olacaktı Daha.

64 bitlik bir sistemse, mantıklı bir senaryo, kodunuzun "kanonik olmayan bir işaretçi" kullanmasıdır - bu, 64 bitlik bir adresin, adresin üst 16 bitinin olmayacağı şekilde oluşturulduğu anlamına gelir. alt 48 bitin üstünün tüm kopyaları (başka bir deyişle, bir adresin en üstteki 16 bitinin tümü, 16 bitin hemen altındaki bit bazında 0 veya tümü 1 olmalıdır). Bu kural, mimarinin "adres aralığındaki geçerli bit sayısını güvenli bir şekilde genişletebileceğini" garanti etmek için uygulanmaktadır. Bu, kodun ya bazı işaretçi verilerinin üzerine başka şeyler yazdığını ya da bazı işaretçi değerlerini okurken sınırların dışına çıktığını gösterir.

Bir başka olası neden, bir SSE yazmacıyla hizasız erişimdir - başka bir deyişle, 16 bayt hizalı olmayan bir adresten 16 baytlık bir SSE kaydı okumak.

Söylediğim gibi, birçok olası neden var, ancak bunların çoğu 32 veya 64 bit işletim sisteminde "normal" kodun yapmayacağı şeyleri içeriyor (geçersiz seçici indeksli segment kayıtlarını yüklemek veya MSR'ler (modele özgü kayıtlar)).


24

Hata ayıklamak ve kaynağı bulmak için: Uygulama için Zombies'i etkinleştirin (Ürün \ Şema) ve Aletleri Başlatın, Zombileri Seçin. Uygulamanızı Xcode'da çalıştırın Ardından Instruments'a gidin ve kaydetmeye başlayın. Uygulamanıza geri dönün ve hatayı oluşturmayı deneyin. Aletler, varsa kötü aramayı (zombiye) algılamalıdır.

Umarım yardımcı olur!



23

Genellikle başlık dosyalarından bilgi alabilirsiniz. Örneğin:

$ cd /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.9.sdk
$ find usr -name \*.h -exec fgrep -l EXC_I386_GPFLT {} \;
usr/include/mach/i386/exception.h
^C
$ more usr/include/mach/i386/exception.h
....
#define EXC_I386_GPFLT          13      /* general protection fault     */

Tamam, yani bu genel bir koruma hatası (yine de adından da anlaşılacağı gibi). Googling "i386 genel koruma hatası" pek çok isabet sağlıyor, ancak bu ilginç görünüyor :

Bellek koruması, segment tanımlayıcıları kullanılarak da uygulanır. İlk olarak, işlemci bir bölüm kaydına yüklenen bir değerin geçerli bir tanımlayıcıya başvurup başvurmadığını kontrol eder. Daha sonra, hesaplanan her doğrusal adresin gerçekten segment içinde yer alıp almadığını kontrol eder. Ayrıca, erişim türü (okuma, yazma veya yürütme) segment tanımlayıcısındaki bilgilerle karşılaştırılır. Bu kontrollerden biri başarısız olduğunda, istisna (interrupt) 13 (hex 0D) yükseltilir. Bu istisna, Genel Koruma Hatası (GPF) olarak adlandırılır.

Bu 13, başlık dosyalarında gördüğümüzle eşleşiyor, dolayısıyla aynı şey gibi görünüyor. Ancak, uygulama programcısının bakış açısından, bu sadece olmamamız gereken belleğe başvurduğumuz anlamına gelir ve donanımda nasıl uygulandığı gerçekten önemli değil.


1
Bununla birlikte, modern işletim sistemleri genel olarak bellek koruması için segmentler kullanmaz. Hepsi MMU ile yapılır ve bir PF'ye, vektör 14'e (genellikle "Segmentasyon hatası" olarak gösterilir) yol açar.
Mats Petersson

16

Bunun neden birim testlerimde ortaya çıktığını merak ettim.

Bir protokole bir yöntem bildirimi ekledim. throws ; ancak potansiyel olarak fırlatma yöntemi o testte bile kullanılmadı. Zombileri testte etkinleştirmek çok fazla sorun gibi geldi.

Görünüşe göre ⌘K temiz hile yaptı. Bu gerçek sorunları çözdüğünde hep şaşkına dönmüşümdür.


Bu benim için Swift'de de düzeltti. Teşekkürler!
lwdthe1

8

Swift 4.2'de de benzer bir istisnam vardı. Kodumda bir hata bulmaya çalışmak için yaklaşık yarım saat harcadım, ancak Xcode'u kapattıktan ve türetilmiş veri klasörünü kaldırdıktan sonra sorun ortadan kalktı. İşte kısayol:

rm -rf ~/Library/Developer/Xcode/DerivedData

2

Benim durumumda, iOS simülatöründe bir uygulama çalıştırırken Xcode'da hata atıldı. "Hatanın ne anlama geldiğini" belirli bir soruyu yanıtlayamasam da bana neyin yardımcı olduğunu söyleyebilirim, belki başkalarına da yardımcı olabilir.

Benim için çözüm Erase All Content and Settingssimülatörde ve Clean Build Folder...Xcode'da idi.


1

Bir görünümden çıkarken bu sorunu yaşadım (önceki görünüme geri dön).

sebep sahip olmaktı

addSubview(view)
view.translatesAutoresizingMaskIntoConstraints = false
NSLayoutConstraint.activate([
    view.leadingAnchor.constraint(equalTo: safeAreaLayoutGuide.leadingAnchor),
    view.topAnchor.constraint(equalTo: safeAreaLayoutGuide.topAnchor),
    view.trailingAnchor.constraint(equalTo: safeAreaLayoutGuide.trailingAnchor),
    view.bottomAnchor.constraint(equalTo: safeAreaLayoutGuide.bottomAnchor)
])

Değişim safeAreaLayoutGuideiçinself sorunu çözmek.

Anlamı, görünümü güvenli alan yerine ön, arka, üst, alt ile hizalar)


0

Bu benim başıma geldi çünkü Xcode iki farklı sınıfta aynı değişken adını kullanmaktan hoşlanmıyordu (eğer önemliyse, değişken adının herhangi bir protokolle ilgili hiçbir şeyi olmasa da aynı protokole uyan). Sadece yeni değişkenimi yeniden adlandırdım.

Hata ayıklarken görmek için çöktüğü ayarlayıcılara adım atmak zorunda kaldım. Bu cevap iOS için geçerlidir


0

Hata, selfolarak tanımlanan bir kapağın içine atılırsa unowned, erişebilecekleriniz sınırlı olabilir ve belirli durumlarda bu hata kodunu alırsınız. Özellikle hata ayıklama sırasında. Bu durumda size değiştirmeyi deneyin için [unowned self]için[weak self]


0

Bunu yaparken şu hatayı aldım:

 NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] initWithObjectsAndKeys:<#(nonnull id), ...#>, nil]; //with 17 objects and keys

Geri döndüğümde gitti:

NSMutableDictionary *aDictionary=[[NSMutableDictionary alloc] init];
[aDictionary setObject:object1 forKey:@"Key1"]; //17 times

0

Benim için, film şeridi ile ilgili sorun, iOS 9.0 ve daha sonra önceden iOS 10.0 ve üstü için ayarlanmış ViewController derleme seçeneği var. Aslında ver'i 10'dan iOS 9.3'e düşürmek istiyorum.

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.