Fatal Error, bir uygulamanın anında sonlanmasına (çökme) neden olan kritik bir hatadır. Ölümcül olmayan hatanın aksine, ölümcül hata programa kurtarma şansı bırakmaz — işlem işletim sistemi veya çalışma zamanı ortamı tarafından zorla sonlandırılır. Firebase Crashlytics 2024'e göre, ortalama bir uygulama her çökmeden sonra kullanıcılarının %2,5'ini kaybeder ve ölümcül hataları düzeltmek mobil geliştirmede bir numaralı önceliktir. Crash-free oranı ne kadar yüksekse, uygulamanın mağazalardaki puanı o kadar yüksek ve kullanıcı kaybı o kadar düşük olur.
Önemli Noktalar
Fatal Error, programın yürütülmesinin devam edemediği bir hatadır. İşletim sistemi veya sanal makine, veri bozulmasını önlemek için işlemi sonlandırır. iOS'ta ölümcül bir hata SIGABRT veya SIGSEGV sinyali tetikler; Android'de ise kök işleyiciye ulaşan işlenmemiş bir istisna işlemi sonlandırır. Uygulama anında kapanır ve kullanıcı Ana Ekrana döner.
Ölümcül hatanın karakteristik belirtileri: tam yığın izi içeren bir çökme raporu, uygulamanın beklenmedik şekilde kaybolması, işlem sonlandırmayla ilgili sistem günlüğü girişi, kapanmadan önce siyah veya beyaz ekran. Kullanıcı, oturumu kurtarma imkanı olmadan Ana ekranı görür — uygulama sıfırdan yeniden başlatılmalıdır. iOS'ta çökmeye Xcode Organizer üzerinden erişilebilen bir .crash dosyası eşlik eder.
Her çökme kullanıcı tutma oranını olumsuz etkiler. Google Play Console 2024'e göre, crash-free oranı %99,5'in altında olan uygulamalar arama ve önerilerde daha düşük puan alır. Çökme oranı, App Store ve Google Play için temel kalite sinyallerinden biridir — yüksek düzeyde ölümcül hata, güncelleme yayınlamayı engelleyebilir. Finans ve tıp uygulamaları için %99,9'un altındaki crash-free oranı kabul edilemez olarak değerlendirilir.
Null işaretçi başvurusu mobil uygulamalarda ölümcül hataların önde gelen nedenidir. Null olan bir nesnenin özelliğine veya yöntemine erişmeye çalışmak Android'de NullPointerException'a veya iOS'ta EXC_BAD_ACCESS'e neden olur. JetBrains 2023'e göre, tüm üretim çökmelerinin yaklaşık %28'i null işaretçilerle ilgilidir. Kotlin'in null-safety sistemi bu oranı önemli ölçüde azaltır, ancak force unwrap ve Java uyumluluğu sorunun kaynakları olmaya devam eder.
Var olmayan bir dizinle koleksiyon öğesine erişmek çökmelerin ikinci en yaygın nedenidir. Java ve Kotlin'de bu ArrayIndexOutOfBoundsException'dır; Swift'te — fatal error: Index out of range. Bu genellikle filtreleme sonrası veya koleksiyon boyutunun dinamik olarak değiştirilmesi sırasında listelerle çalışırken ortaya çıkar. getOrNull (Kotlin) veya indices.contains (Swift) gibi güvenli yöntemler kullanmak bu tür ölümcül hatayı önler.
Bellek yetersizliği (OutOfMemoryError), yığın taşması (StackOverflowError), var olmayan kaynak yükleme — kaynak hataları genellikle ölümcüldür ve tekrarlanması zordur. OutOfMemoryError, sıkıştırma olmadan büyük resimler yüklerken veya serbest bırakılmayan referanslar nedeniyle bellek sızıntısı nedeniyle oluşur. StackOverflowError, temel durum olmadan derin özyineleme veya temsilci zincirinde döngüsel çağrılar nedeniyle oluşur.
Deadlock, yarış koşulu, yineleme sırasında koleksiyon değişikliği — çoklu iş parçacığı hataları belirli olmayan bir şekilde ortaya çıkar ve teşhis edilmesi en zor olanlardır. Android'de, farklı iş parçacıklarından ArrayList değiştirilirken ConcurrentModificationException; iOS'ta, senkronizasyon olmadan NSMutableArray değiştirilirken çökme meydana gelir. Kotlin coroutines (yapılandırılmış eşzamanlılık) veya Swift Actors (iOS 16+) kullanmak eşzamanlılık çökmeleri olasılığını azaltır.
Temel fark kurtarılabilirliktir. Non-Fatal Error programın devam etmesine izin verir: ağ zaman aşımı try-catch ile işlenir, ayrıştırma hatası varsayılan bir değerle değiştirilir. Fatal Error'un böyle bir yolu yoktur — çökme kaçınılmazdır ve uygulama yeniden başlatılmalıdır. Bu hata türleri arasındaki sınır uygulama mimarisi tarafından belirlenir.
| Özellik | Fatal Error | Non-Fatal Error |
|---|---|---|
| Uygulama sonlanması | Evet | Hayır |
| Kurtarma | İmkansız | catch bloğu ile mümkün |
| Bilgi toplama | Sadece çökme raporlayıcı | Koddan günlükleme |
| UX hasarı | Tam oturum başarısızlığı | Geçici rahatsızlık |
| Tipik örnek | NullPointerException | IOException |
Aynı hata bir platformda ölümcül, diğerinde ölümcül olmayabilir. Sıfıra bölme Java/Kotlin'de ArithmeticException fırlatır (ölümcül değil — yakalanabilir), Swift'te ise fatal error: Division by zero'ya neden olur (yakalanamayan çökme). Geliştirici, hata işleme tasarlarken belirli dil ve çalışma zamanı ortamının davranışını hesaba katmalıdır. Ölümcül ve ölümcül olmayan arasındaki sınırı anlamak, mobil uygulamada hataya dayanıklı mimari kurmanın temelidir.
Firebase Crashlytics, mobil uygulamalarda çökmeleri teşhis etmek için fiili standarttır. SDK, çökmeden hemen önce yığın izini, cihaz durumunu, işletim sistemi sürümünü ve günlükleri otomatik olarak toplar. Gösterge paneli, aynı çökmeleri tek bir sorunda gruplayarak etkilenen kullanıcı sayısını, sıklığı ve çökmenin meydana geldiği uygulama sürümünü gösterir.
// Bir Android uygulamasında Crashlytics'i başlatma
class MainApplication : Application() {
override fun onCreate() {
super.onCreate()
FirebaseApp.initializeApp(this)
Crashlytics.setCustomKey("build_type", "production")
}
}
// Çökme teşhisi için özel kullanıcı verileri ayarlama
Crashlytics.setUserId("user_12345")
Crashlytics.setCustomKey("screen", "ProfileFragment")
Crashlytics.setCustomKey("api_response", responseCode)
// Entegrasyon testi için zorla çökme
Crashlytics.crash()
Sentry daha ayrıntılı teşhis sunan bir alternatiftir. Sentry yalnızca yığın izini değil, aynı zamanda tüm değişkenlerin durumunu, hatadan önceki olay sırasını ve yürütme bağlamını da gösterir. Sentry'nin Breadcrumbs özelliği, ölümcül hatadan önceki kullanıcı eylemleri zincirini (düğme tıklamaları, ekran geçişleri, ağ istekleri) yeniden oluşturmayı sağlar. Sentry ayrıca kapsamlı kalite analizi için performans ve oturum izleme sunar.
iOS'ta çökmelerin doğru teşhisi için dSYM dosyalarının (hata ayıklama sembolleri) Crashlytics veya Sentry'ye yüklenmesi gerekir. dSYM olmadan yığın izi, işlev adları yerine yalnızca bellek adreslerini içerir. Android için ProGuard veya R8 kullanılırken eşleme dosyalarının yüklenmesi gerekir. Xcode'da derleme aşaması veya Gradle eklentisi aracılığıyla dSYM yüklemenin otomatikleştirilmesi, üretim derlemeleri için zorunludur.
Temel önleme yöntemi, tüm isteğe bağlı ve nullable değerlerin safe unwrappingidir. Swift'te if-let ve Kotlin'de ?: ile let kullanımı null işaretçi hatalarını ortadan kaldırır. Değer garantisi olmadan force unwrap yapılmamalıdır. Hem Kotlin hem de Swift derleyicileri potansiyel olarak tehlikeli işlemler hakkında uyarır — bu uyarılar üretim kodunda göz ardı edilemez.
// safe unwrapping ile fatal error'u ÖNLEME
func processUser(id: String) -> String {
guard let user = database.findUser(by: id) else {
return "User not found"
}
guard let email = user.email else {
return "Email not set"
}
return email
}
// Koleksiyon öğelerine güvenli erişim
func safeGet <T>(items: [T], index: Int) -> T? {
guard items.indices.contains(index) else { return nil }
return items[index]
}
// Erişimden önce dizi sınırlarını kontrol etme
let numbers = [1, 2, 3]
if numbers.indices.contains(5) {
print(numbers[5])
} else {
print("Index out of range")
}
Defensive programming ikinci koruma seviyesidir. İşlevlerin girdi parametrelerini her zaman kontrol edin, force unwrap yerine Optional veya Result döndürün ve geliştirme sırasında erken hata tespiti için hata ayıklama derlemelerinde assert kullanın. Sınır durumları (null, boş koleksiyonlar, geçersiz dizinler) için birim testleri, uygulamanın iş mantığındaki tüm herkese açık giriş noktalarını kapsamalıdır.
React Native ve SwiftUI'de, işleme hatalarını yakalayan ve çökme yerine yedek UI gösteren bir error boundary ayarlayabilirsiniz. Bu, kullanıcı açısından ölümcül bir UI hatasını ölümcül olmayana dönüştürür — uygulama çalışmaya devam eder ve kullanıcı beyaz ekran yerine belirli bir arayüz bloğunda hata mesajı görür.
CI/CD hattına otomatik kontrollerin entegrasyonu: statik analiz (Kotlin için Detekt, Swift için SwiftLint), gerçek cihazlarda UI testleri çalıştırma, test ortamında crash-free oranını kontrol etme. Çökme oranı eşiği aşıldığında birleştirmeyi engelleme (önerilen eşik: her commit'te %0,1'den fazla yeni çökme).
Sıkça Sorulan Sorular
Hayır, fatal error'dan sonra kurtarma imkansızdır — işlem işletim sistemi seviyesinde sonlanır. Tek yol, güvenli yapılar, defensive programming ve geliştirme sırasında sınır durumlarının kapsamlı testi yoluyla ölümcül hatayı oluşmadan önce önlemektir.
Segfault (SIGSEGV), geçersiz bir bellek alanına erişirken oluşan bir ölümcül hata türüdür. FATAL ERROR, segfault, abort, stack overflow, out of memory ve çalışma zamanında işlenmemiş istisnalar dahil olmak üzere tüm kurtarılamaz hatalar için genel bir terimdir.
Crashlytics (Firebase) veya Sentry SDK entegrasyonu, işlenmemiş tüm istisnaları otomatik olarak toplar. SDK, işletim sistemi sinyallerini ve çalışma zamanı istisnalarını yakalar, yığın izi ve bağlam içeren bir çökme raporu oluşturur ve uygulamanın bir sonraki başlatılışında sunucuya gönderir.
Çökme işleme testi için hata ayıklama derlemesinde force crash kullanılır. Crashlytics, ölümcül hatayı simüle etmek için crash() yöntemi sağlar. Birim testleri guard ve if-let'in doğruluğunu doğrular, UI testleri ise veri girişi ve arayüz durumlarının sınır durumlarını kapsar.
Hayır, yalnızca işlenmemiş istisnalar ölümcül olur. Try-catch tarafından yakalanan bir istisna ölümcül değildir. İşlenmiş ve işlenmemiş istisna arasındaki fark, uygulamanın sonlanıp sonlanmayacağını veya kullanıcı deneyimine minimum hasarla alternatif bir durumda çalışmaya devam edip etmeyeceğini belirler.
Özet
Anahtar teslim bir mobil uygulama geliştireceğiz
IT Sectr, 2017'den beri girişimler ve işletmeler için iOS ve Android uygulamaları oluşturmaktadır. Size danışmanlık yapacak ve en iyi çözümü önereceğiz.
Ayrıca okuyun