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

Crashlytics kontrol panelinde bir soruna tıklayıp ayrıntılı bir etkinlik raporu alabilirsiniz. Uygulamanızda neler olup bittiğini ve Crashlytics'e bildirilen olaylarla ilgili koşulları daha iyi anlamanıza yardımcı olmak için bu raporları ö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şlemlerine ilişkin görünürlük sağlar.

  • Otomatik kilitlenme raporlamasını kapatın ve kullanıcılarınız için isteğe bağlı raporlamayı etkinleştirin . Varsayılan olarak Crashlytics'in uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak topladığını unutmayın.

Özel anahtarlar ekleyin

Özel anahtarlar, uygulamanızın çökmeye yol açacak spesifik durumunu öğrenmenize yardımcı olur. Kilitlenme raporlarınızla rastgele anahtar/değer çiftlerini ilişkilendirebilir, ardından Firebase konsolunda kilitlenme raporlarını aramak ve filtrelemek için özel anahtarları kullanabilirsiniz.

  • Crashlytics kontrol panelinde özel bir anahtarla eşleşen sorunları arayabilirsiniz.
  • Konsolda belirli bir sorunu incelerken, her etkinlik için ilişkili özel anahtarları görüntüleyebilir ( Anahtarlar alt sekmesi) ve 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. Örneğin:

Süratli

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

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

Amaç-C

Tamsayıları, booleanları veya kayan sayıları 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"];

Mevcut bir anahtarın değerini, anahtarı çağırıp farklı bir değere ayarlayarak da değiştirebilirsiniz. Örneğin:

Süratli

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

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

Amaç-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 NSDictionary içeren setCustomKeysAndValues ​​yöntemini kullanarak anahtar/değer çiftlerini toplu olarak ekleyin:

Süratli

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)

Amaç-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 bağlam kazandırmak için uygulamanıza özel Crashlytics günlükleri ekleyebilirsiniz. Crashlytics, günlükleri kilitlenme verilerinizle ilişkilendirir ve bunları Firebase konsolunun Crashlytics sayfasında Günlükler sekmesi altında görüntüler.

Süratli

Sorunları belirlemeye yardımcı olması için log() veya log(format:, arguments:) kullanın. Mesajlarla birlikte kullanışlı bir günlük çıktısı almak istiyorsanız log() a 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. Örneğin:

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

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

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

log() veya log(format:, arguments:) nasıl kullanılacağına ilişkin daha fazla ayrıntı için Crashlytics referans belgelerine bakın.

Amaç-C

Sorunları tespit etmeye yardımcı olması için log veya logWithFormat kullanın. Mesajlarla faydalı bir günlük çıktısı almak istiyorsanız, her iki yönteme de ilettiğiniz nesnenin description örneği özelliğini geçersiz kılması gerektiğini unutmayın. Örneğin:

[[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 nasıl kullanılacağı hakkında daha fazla ayrıntı için Crashlytics referans belgelerine bakın.

Kullanıcı tanımlayıcılarını ayarlayın

Bir sorunu teşhis etmek için hangi kullanıcılarınızın belirli bir kilitlenmeyle karşılaştığını bilmek genellikle yararlı olur. Crashlytics, kilitlenme raporlarınızdaki kullanıcıları anonim olarak tanımlamanın bir yolunu içerir.

Raporlarınıza kullanıcı kimlikleri eklemek için her kullanıcıya kimlik numarası, belirteç veya karma değeri biçiminde benzersiz bir tanımlayıcı atayın:

Süratli

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

Amaç-C

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

Bir kullanıcı tanımlayıcısını ayarladıktan sonra silmeniz 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 desteğiyle iletişime geçin .

Önemli olmayan istisnaları bildirin

Crashlytics, uygulamanızın kilitlenmelerini otomatik olarak raporlamanın yanı sıra, önemli olmayan istisnaları kaydetmenize ve uygulamanızın bir sonraki başlatılışında bunları size göndermenize olanak tanır.

NSError nesnelerini recordError yöntemiyle kaydederek önemli olmayan istisnaları kaydedebilirsiniz. recordError [NSThread callStackReturnAddresses] öğesini çağırarak iş parçacığının çağrı yığınını yakalar.

Süratli

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

Amaç-C

[[FIRCrashlytics crashlytics] recordError:error];

recordError yöntemini kullanırken NSError yapısını ve Crashlytics'in çökmeleri gruplandırmak 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.

Bir NSError nesnesinin üç argümanı vardır:

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

Yığın izleme analizi yoluyla gruplandırılan ölümcül çökmelerin aksine, günlüğe kaydedilen hatalar domain ve code göre gruplandırılır. Bu, ölümcül çökmeler ile günlüğe kaydedilen hatalar arasındaki önemli bir ayrımdır. Örneğin:

Süratli

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)

Amaç-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 tarafından gruplandırılan yeni bir sorun oluşturulur. Aynı alanı ve kod değerlerini kullanan ek günlüğe kaydedilen hatalar, aynı sorun altında gruplandırılır. userInfo nesnesinin içerdiği veriler, anahtar/değer çiftlerine dönüştürülür ve tek bir sayı içindeki anahtarlar/günlükler bölümünde görüntülenir.

Günlükler ve özel anahtarlar

Kilitlenme raporlarında olduğu gibi, NSError bağlam eklemek için günlükleri ve özel anahtarları gömebilirsiniz. Ancak, çökmelere 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ılan günlüklerdir. Bir NSError günlüğe kaydettiğinizde uygulama hemen sonlandırılmaz. Crashlytics, günlüğe kaydedilen hata raporunu yalnızca bir sonraki uygulama başlatıldığında gönderdiğinden ve diskteki günlükler için ayrılan alan miktarını sınırlamak zorunda olduğundan, bir NSError kaydedildikten sonra, Crashlytics'in gönderdiği zamana kadar ilgili tüm günlüklerin döndürülmesi için yeterli miktarda günlük kaydı yapmak mümkündür. cihazdan gelen rapor. Uygulamanızda NSErrors günlüğe kaydederken ve günlükleri ve özel anahtarları kullanırken bu dengeyi aklınızda bulundurun.

Performans hususları

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

Bu API'yi bir arka plan iş parçacığında çağırmak güvenli olsa da, bu çağrıyı başka bir kuyruğa göndermenin geçerli yığın izlemesinin bağlamını kaybedeceğini unutmayın.

Peki ya NSExceptions?

Crashlytics, NSException örneklerini doğrudan günlüğe kaydetmeye ve kaydetmeye yönelik bir olanak sunmaz. Genel olarak konuşursak, Cocoa ve Cocoa Touch API'leri istisnalara karşı güvenli değildir. Bu, @catch kullanımının, çok dikkatli kullanıldığında bile sürecinizde çok ciddi istenmeyen yan etkilere neden olabileceği anlamına gelir. Kodunuzda asla @catch ifadelerini kullanmamalısınız. Lütfen konuyla ilgili Apple belgelerine bakın.

Yığın izlerini özelleştirme

Uygulamanız yerel olmayan bir ortamda (C++ veya Unity gibi) çalışıyorsa, kilitlenme meta verilerini uygulamanızın yerel istisna biçiminde raporlamak için İstisna Modeli API'sini kullanabilirsiniz. Bildirilen istisnalar ölümcül olmayan olarak işaretlenir.

Süratli

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)

Amaç-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 adreslerle de başlatılabilir:

Süratli

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)

Amaç-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];

Kırıntı günlüklerini alın

Breadcrumb günlükleri, bir kullanıcının uygulamanızla yaşadığı ve kilitlenme, ölümcül olmayan veya ANR olayına yol açan etkileşimleri daha iyi anlamanızı sağlar. Bu günlükler, bir sorunu yeniden oluşturmaya ve hata ayıklamaya çalışırken yararlı olabilir.

İçerik haritası günlükleri Google Analytics tarafından desteklenir; dolayısıyla içerik haritası günlüklerini almak için Firebase projeniz için Google Analytics'i etkinleştirmeniz ve Google Analytics için Firebase SDK'sını uygulamanıza eklemeniz gerekir. Bu gereksinimler karşılandıktan sonra, bir sorunun ayrıntılarını görüntülediğinizde, kırıntı günlükleri, Günlükler sekmesindeki bir etkinliğin verilerine otomatik olarak dahil edilir.

Analytics SDK'sı screen_view olayını otomatik olarak günlüğe kaydeder ; bu, içerik haritası günlüklerinin kilitlenme, ölümcül olmayan olay veya ANR olayından önce görüntülenen ekranların bir listesini göstermesini sağlar. Bir screen_view içerik haritası günlüğü, bir firebase_screen_class parametresi içerir.

İçerik haritası günlükleri ayrıca, etkinliğin parametre verileri de dahil olmak üzere, kullanıcı oturumunda manuel olarak günlüğe kaydettiğiniz tüm özel olaylarla da doldurulur. Bu veriler, kilitlenme, ölümcül olmayan olay veya ANR olayına yol açan bir dizi kullanıcı işleminin gösterilmesine yardımcı olabilir.

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

Katılım raporlamasını etkinleştir

Varsayılan olarak Crashlytics, uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar. Kullanıcılara gönderdikleri veriler üzerinde daha fazla kontrol sağlamak için, otomatik raporlamayı devre dışı bırakarak ve verileri yalnızca kodunuzda seçtiğinizde Crashlytics'e göndererek isteğe bağlı raporlamayı etkinleştirebilirsiniz:

  1. Info.plist dosyanıza yeni bir anahtar ekleyerek otomatik toplamayı kapatın:

    • Anahtar: FirebaseCrashlyticsCollectionEnabled
    • Değer: false
  2. Çalışma zamanında Crashlytics veri toplamayı geçersiz kılmayı çağırarak belirli kullanıcılar için veri toplamayı etkinleştirin. Geçersiz kılma değeri, uygulamanızın başlatılması boyunca 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 uygulanmaz.

    Süratli

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Amaç-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

Crash Insights verilerini yönetin

Crash Insights, anonimleştirilmiş yığın izlerinizi diğer Firebase uygulamalarından gelen izlerle karşılaştırarak ve sorununuzun daha büyük bir eğilimin parçası olup olmadığını size bildirerek sorunları çözmenize yardımcı olur. Hatta Crash Insights birçok sorun için kilitlenme hatalarını ayıklamanıza yardımcı olacak kaynaklar da sağlar.

Crash Insights, ortak kararlılık eğilimlerini belirlemek için toplu kilitlenme verilerini kullanır. Uygulamanızın verilerini paylaşmamayı tercih ediyorsanız Firebase konsolundaki Crashlytics sorun listenizin üst kısmındaki Crash Insights menüsünden Crash Insights'ı devre dışı bırakabilirsiniz.