Firebase Crashlytics kilitlenme raporlarınızı özelleştirme

Crashlytics kontrol panelinde, bir sorunu tıklayıp ayrıntılı etkinlik raporu alabilirsiniz. Bu raporları, uygulamanızda neler olduğunu ve Crashlytics'e bildirilen etkinliklerle ilgili koşulları daha iyi anlamanıza yardımcı olacak şekilde özelleştirebilirsiniz.

  • Uygulamanız Google Analytics için Firebase SDK'sını kullanıyorsa içerik haritası günlüklerini otomatik olarak alın. Bu günlükler, uygulamanızda Crashlytics tarafından toplanan bir etkinliğe yol açan kullanıcı işlemlerini görmenizi sağlar.

  • Otomatik kilitlenme raporlamasını kapatın ve kullanıcılarınız için kayıt bildirmeyi etkinleştirin. Crashlytics'in varsayılan olarak uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak topladığını unutmayın.

Özel anahtarlar ekleyin

Özel anahtarlar, kilitlenmeye yol açan uygulama durumunu öğrenmenize yardımcı olur. Rastgele anahtar/değer çiftlerini kilitlenme raporlarınızla ilişkilendirebilir, ardından özel anahtarları kullanarak Firebase konsolunda kilitlenme raporlarını arayıp filtreleyebilirsiniz.

  • Crashlytics kontrol panelinde, özel bir anahtarla eşleşen sorunları arayabilirsiniz.
  • Konsolda belirli bir sorunu incelerken her etkinlikle ilişkili özel anahtarları (Anahtarlar alt sekmesi) görüntüleyebilir, hatta etkinlikleri özel anahtarlara göre filtreleyebilirsiniz (sayfanın üst kısmındaki Filtre menüsü).

Anahtar/değer çiftlerini ayarlamak için setCustomValue yöntemini kullanın. Örnek:

Swift

// Set int_key to 100.
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")

Objective-C

Tam sayılar, boole değerleri veya kayan noktalı değerleri ayarlarken değeri @(value) olarak kutulayın.

// Set int_key to 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set str_key to "hello".
[[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];

Ayrıca, anahtarı çağırıp farklı bir değere ayarlayarak mevcut bir anahtarın değerini değiştirebilirsiniz. Örnek:

Swift

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set int_key to 50 from 100.
Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")

Objective-C

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set int_key to 50 from 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];

Tek parametre olarak bir NSDictionary (NSDictionary) içeren setCustomKeysAndValues yöntemini kullanarak anahtar/değer çiftlerini toplu olarak ekleyin:

Swift

let keysAndValues = [
                 "string key" : "string value",
                 "string key 2" : "string value 2",
                 "boolean key" : true,
                 "boolean key 2" : false,
                 "float key" : 1.01,
                 "float key 2" : 2.02
                ] as [String : Any]

Crashlytics.crashlytics().setCustomKeysAndValues(keysAndValues)

Objective-C

NSDictionary *keysAndValues =
    @{@"string key" : @"string value",
      @"string key 2" : @"string value 2",
      @"boolean key" : @(YES),
      @"boolean key 2" : @(NO),
      @"float key" : @(1.01),
      @"float key 2" : @(2.02)};

[[FIRCrashlytics crashlytics] setCustomKeysAndValues: keysAndValues];

Özel günlük mesajları ekleyin

Kilitlenmeye yol açan olaylarla ilgili kendinize daha fazla bilgi sağlamak için uygulamanıza özel Crashlytics günlükleri ekleyebilirsiniz. Crashlytics, günlükleri kilitlenme verilerinizle ilişkilendirir ve Firebase konsolunun Crashlytics sayfasındaki Günlükler sekmesinde gösterir.

Swift

Sorunların belirlenmesine yardımcı olması için log() veya log(format:, arguments:) kullanın. Mesajlarla faydalı bir günlük çıkışı almak istiyorsanız log() öğesine ilettiğiniz nesnenin CustomStringConvertible özelliğine uygun olması gerekir. log(), nesne için tanımladığınız açıklama özelliğini döndürür. Örnek:

Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")

.log(format:, arguments:), getVaList() çağrısından döndürülen değerleri biçimlendirir. Örnek:

Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))

log() veya log(format:, arguments:) kullanımıyla ilgili daha ayrıntılı bilgi için Crashlytics referans belgelerine bakın.

Objective-C

Sorunların belirlenmesine yardımcı olması için log veya logWithFormat kullanın. Mesajlarla faydalı bir günlük çıkışı almak istiyorsanız iki yöntemden birine ilettiğiniz nesnenin description örnek özelliğini geçersiz kılması gerektiğini unutmayın. Örnek:

[[FIRCrashlytics crashlytics] log:@"Simple string message"];

[[FIRCrashlytics crashlytics] logWithFormat:@"Higgs-Boson detected! Bailing out... %@", attributesDict];

[[FIRCrashlytics crashlytics] logWithFormat:@"Logging a variable argument list %@" arguments:va_list_arg];

log ve logWithFormat kullanımıyla ilgili daha fazla bilgi için Crashlytics referans belgelerini inceleyin.

Kullanıcı tanımlayıcılarını ayarlama

Bir sorunu teşhis etmek için, belirli bir kilitlenmeyi hangi kullanıcılarınızın yaşadığını bilmek genellikle yararlıdır. Crashlytics, kilitlenme raporlarınızda kullanıcıları anonim olarak tanımlayabileceğiniz bir yöntem içerir.

Raporlarınıza kullanıcı kimlikleri eklemek için her kullanıcıya kimlik numarası, jeton veya karma oluşturma işlemi uygulanmış değer biçiminde benzersiz bir tanımlayıcı atayın:

Swift

Crashlytics.crashlytics().setUserID("123456789")

Objective-C

[[FIRCrashlytics crashlytics] setUserID:@"123456789"];

Bir kullanıcı tanımlayıcısını ayarladıktan sonra onu temizlemeniz gerekirse değeri boş bir dizeye sıfırlayın. Bir kullanıcı tanımlayıcısının temizlenmesi, mevcut Crashlytics kayıtlarını kaldırmaz. Bir kullanıcı kimliğiyle ilişkili kayıtları silmeniz gerekiyorsa Firebase destek ekibiyle iletişime geçin.

Önemli olmayan istisnaları bildirin

Crashlytics, uygulamanızın kilitlenmelerini otomatik olarak bildirmenin yanı sıra önemli olmayan istisnaları kaydetmenizi sağlar ve uygulamanız tekrar başlatıldığında size gönderir.

recordError yöntemiyle NSError nesneyi kaydederek önemli olmayan istisnaları kaydedebilirsiniz. recordError, [NSThread callStackReturnAddresses] çağrısı yaparak ileti dizisinin çağrı yığınını yakalar.

Swift

Crashlytics.crashlytics().record(error: error)

Objective-C

[[FIRCrashlytics crashlytics] recordError:error];

recordError yöntemini kullanırken NSError yapısını ve Crashlytics'in kilitlenmeleri gruplamak için verileri nasıl kullandığını anlamak önemlidir. recordError yönteminin yanlış kullanımı, öngörülemeyen davranışlara neden olabilir ve Crashlytics'in, uygulamanız için günlüğe kaydedilen hataların raporlanmasını sınırlamasına neden olabilir.

NSError nesnesinin üç bağımsız değişkeni vardır:

  • domain: String
  • code: Int
  • userInfo: [AnyHashable : Any]? = nil

Yığın izleme analiziyle gruplandırılan önemli kilitlenmelerin aksine, günlüğe kaydedilen hatalar domain ve code ölçütlerine göre gruplandırılır. Bu, önemli kilitlenmeler ile günlüğe kaydedilen hatalar arasındaki önemli bir ayrımdır. Örnek:

Swift

let userInfo = [
  NSLocalizedDescriptionKey: NSLocalizedString("The request failed.", comment: ""),
  NSLocalizedFailureReasonErrorKey: NSLocalizedString("The response returned a 404.", comment: ""),
  NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString("Does this page exist?", comment: ""),
  "ProductID": "123456",
  "View": "MainView"
]

let error = NSError.init(domain: NSCocoaErrorDomain,
                         code: -1001,
                         userInfo: userInfo)

Objective-C

NSDictionary *userInfo = @{
  NSLocalizedDescriptionKey: NSLocalizedString(@"The request failed.", nil),
  NSLocalizedFailureReasonErrorKey: NSLocalizedString(@"The response returned a 404.", nil),
  NSLocalizedRecoverySuggestionErrorKey: NSLocalizedString(@"Does this page exist?", nil),
  @"ProductID": @"123456",
  @"View": @"MainView",
};

NSError *error = [NSError errorWithDomain:NSCocoaErrorDomain
                                     code:-1001
                                 userInfo:userInfo];

Yukarıdaki hatayı günlüğe kaydettiğinizde NSSomeErrorDomain ve -1001 ölçütlerine göre gruplandırılmış yeni bir sorun oluşturulur. Aynı alan adı ve kod değerlerini kullanan ek günlüğe kaydedilen hatalar, aynı sorun altında gruplandırılır. userInfo nesnesinde yer alan veriler, anahtar/değer çiftlerine dönüştürülür ve tek bir sorunun anahtar/günlükler bölümünde gösterilir.

Günlükler ve özel anahtarlar

Kilitlenme raporlarında olduğu gibi, NSError öğesine bağlam eklemek için günlükleri ve özel anahtarları yerleştirebilirsiniz. Ancak kilitlenmelere hangi günlüklerin eklendiği ile günlüğe kaydedilen hatalar arasında bir fark vardır. Bir kilitlenme meydana geldiğinde ve uygulama yeniden başlatıldığında Crashlytics'in diskten aldığı günlükler, kilitlenme anına kadar yazılmış olan günlüklerdir. Bir NSError günlüğe kaydedildiğinde uygulama hemen sonlandırılmaz. Crashlytics, günlüğe kaydedilen hata raporunu yalnızca bir sonraki uygulama lansmanında gönderdiğinde ve diskteki günlükler için ayrılan alan miktarını sınırlaması gerektiğinden, NSError kaydedildikten sonra yeterli miktarda günlük kaydı yapılabilir. Böylece Crashlytics, raporu cihazdan gönderdiğinde ilgili tüm günlükler döndürülebilir. NSErrors verilerini günlüğe kaydederken ve uygulamanızda günlükler ile özel anahtarları kullanırken bu dengeyi aklınızda bulundurun.

Performansla ilgili konular

NSError günlüğe kaydetmenin oldukça pahalı olabileceğini unutmayın. Çağrı yaptığınız sırada Crashlytics, yığın geri alma adlı bir işlem kullanarak mevcut iş parçacığının çağrı yığınını yakalar. Bu işlem, özellikle DWARF geri sarmasını (arm64 ve x86) destekleyen mimarilerde CPU ve G/Ç açısından yoğun olabilir. Geri alma işlemi tamamlandıktan sonra bilgiler diske eşzamanlı olarak yazılır. Bu, sonraki satırın çökmesi durumunda veri kaybını önler.

Bu API'yi arka plan iş parçacığı üzerinde çağırmak güvenli olsa da bu çağrıyı başka bir sıraya göndermenin, mevcut yığın izlemenin bağlamını kaybedeceğini unutmayın.

NSExceptions nedir?

Crashlytics, NSException örneklerini doğrudan günlüğe kaydetme ve kaydetme olanağı sunmaz. Genel olarak Cocoa ve Cocoa Touch API'leri istisnai düzeyde güvenli değildir. Bu durum, @catch kullanımının son derece dikkatli bir şekilde kullanılsa bile işleminizde çok ciddi istenmeyen yan etkileri olabileceği anlamına gelir. Kodunuzda hiçbir zaman @catch ifadelerini kullanmamalısınız. Lütfen konuyla ilgili Apple'ın belgelerini inceleyin.

Yığın izlemeyi özelleştirme

Uygulamanız yerel olmayan bir ortamda (C++ veya Unity gibi) çalışıyorsa kilitlenme meta verilerini uygulamanızın yerel istisna biçiminde bildirmek için Exception Model API'yi kullanabilirsiniz. Bildirilen istisnalar önemli olmayanlar olarak işaretlenir.

Swift

var  ex = ExceptionModel(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame(symbol:"makeError", file:"handler.js", line:495),
  StackFrame(symbol:"then", file:"routes.js", line:102),
  StackFrame(symbol:"main", file:"app.js", line:12),
]

crashlytics.record(exceptionModel:ex)

Objective-C

FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithSymbol:@"makeError" file:@"handler.js" line:495],
  [FIRStackFrame stackFrameWithSymbol:@"then" file:@"routes.js" line:102],
  [FIRStackFrame stackFrameWithSymbol:@"main" file:@"app.js" line:12],
];

[[FIRCrashlytics crashlytics] recordExceptionModel:model];

Özel yığın çerçeveleri yalnızca şu adreslerle de başlatılabilir:

Swift

var  ex = ExceptionModel.init(name:"FooException", reason:"There was a foo.")
ex.stackTrace = [
  StackFrame(address:0xfa12123),
  StackFrame(address:12412412),
  StackFrame(address:194129124),
]

crashlytics.record(exceptionModel:ex)

Objective-C

FIRExceptionModel *model =
    [FIRExceptionModel exceptionModelWithName:@"FooException" reason:@"There was a foo."];
model.stackTrace = @[
  [FIRStackFrame stackFrameWithAddress:0xfa12123],
  [FIRStackFrame stackFrameWithAddress:12412412],
  [FIRStackFrame stackFrameWithAddress:194129124],
];


[[FIRCrashlytics crashlytics] recordExceptionModel:model];

İçerik haritası günlüklerini alma

İçerik haritası günlükleri, kullanıcıların uygulamanızda kurduğu, kilitlenmeye, önemli olmayan veya ANR etkinliğine neden olan etkileşimleri daha iyi anlamanızı sağlar. Bu günlükler, bir sorunu yeniden oluşturup hata ayıklamaya çalışırken faydalı olabilir.

İçerik haritası günlükleri Google Analytics tarafından desteklenmektedir. Bu nedenle, içerik haritası günlüklerini almak için Firebase projenizde Google Analytics'i etkinleştirmeniz ve Google Analytics için Firebase SDK'sını uygulamanıza eklemeniz gerekir. Bu şartlar karşılandıktan sonra, bir sorunun ayrıntılarını görüntülediğinizde içerik haritası günlükleri Günlükler sekmesine etkinlik verileriyle otomatik olarak eklenir.

Analytics SDK'sı screen_view etkinliğini otomatik olarak günlüğe kaydeder. Bu etkinlik, içerik haritası günlüklerinde kilitlenme, önemli olmayan veya ANR etkinliğinden önce görüntülenen ekranların listesini göstermesini sağlar. screen_view içerik haritası günlüğü firebase_screen_class parametresi içeriyor.

İçerik haritası günlükleri, etkinliğin parametre verileri de dahil olmak üzere kullanıcının oturumunda manuel olarak girdiğiniz tüm özel etkinliklerle doldurulur. Bu veriler; kilitlenme, önemli olmayan veya ANR etkinliğiyle sonuçlanan bir dizi kullanıcı işlemini göstermeye yardımcı olabilir.

İçerik haritası günlüklerini dolduran verileri içeren Google Analytics verilerinin toplanmasını ve kullanımını kontrol edebileceğinizi unutmayın.

Kayıt raporlamayı etkinleştir

Crashlytics, varsayılan olarak uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar. Kullanıcıların gönderdikleri veriler üzerinde daha fazla kontrol sahibi olmaları için otomatik raporlamayı devre dışı bırakarak ve sadece kodunuzda istediğiniz zaman Crashlytics'e veri göndererek kayıt raporlamayı etkinleştirebilirsiniz:

  1. Info.plist dosyanıza yeni bir anahtar ekleyerek otomatik toplamayı devre dışı bırakın:

    • Anahtar: FirebaseCrashlyticsCollectionEnabled
    • Değer: false
  2. Çalışma zamanında Crashlytics veri toplama geçersiz kılmasını çağırarak belirli kullanıcılar için veri toplamayı etkinleştirin. Geçersiz kılma değeri, uygulamanızın lansmanları genelinde devam eder. Böylece Crashlytics, raporları otomatik olarak toplayabilir.

    Otomatik kilitlenme raporlamasını devre dışı bırakmak için geçersiz kılma değeri olarak false değerini iletin. false olarak ayarlandığında yeni değer, uygulamanın bir sonraki çalıştırılmasına kadar geçerli olmaz.

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Crash Insights verilerini yönetme

Crash Insights, anonimleştirilmiş yığın izlerinizi diğer Firebase uygulamalarındaki izlerle karşılaştırarak ve sorununuzun daha büyük bir trendin parçası olup olmadığını bildirerek sorunları çözmenize yardımcı olur. Crash Insights, çoğu sorun için kilitlenmede hata ayıklamanıza yardımcı olacak kaynaklar bile sağlar.

Crash Insights, yaygın kararlılık trendlerini belirlemek için birleştirilmiş kilitlenme verilerini kullanır. Uygulamanızın verilerini paylaşmak istemiyorsanız Firebase konsolundaki Crashlytics sorun listenizin üst kısmındaki Crash Insights menüsünden Crash Insights'ı devre dışı bırakabilirsiniz.