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


Crashlytics kontrol panelinde bir sorunu tıklayarak ayrıntılı bir etkinlik raporu alabilirsiniz. Bu raporları, uygulamanızda neler olduğunu ve Crashlytics'a 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 breadcrumb günlüklerini otomatik olarak alın. Bu günlükler, uygulamanızda Crashlytics ile toplanan bir etkinliğe yol açan kullanıcı işlemlerini görmenizi sağlar.

  • Otomatik kilitlenme raporlamayı devre dışı bırakın ve kullanıcılarınız için katılıma dayalı raporlamayı etkinleştirin. Crashlytics'nın varsayılan olarak uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak topladığını unutmayın.

Özel anahtar ekleme

Özel anahtarlar, uygulamanızın kilitlenmeye yol açan belirli durumunu almanıza yardımcı olur. Kilitlenme raporlarınızla rastgele anahtar/değer çiftleri 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 etkinlikle ilişkili özel anahtarları (Anahtarlar alt sekmesi) görüntüleyebilir 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:

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ğerlerini 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:

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 NSDictionary ile 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ı ekleme

Kilitlenmeye yol açan etkinlikler hakkında daha fazla bilgi edinmek 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ı belirlemek için log() veya log(format:, arguments:) öğesini kullanın. Mesaj içeren yararlı bir günlük çıktısı almak istiyorsanız log() öğesine ilettiğiniz nesne, CustomStringConvertible özelliğine uygun olmalıdır. 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 biçimlendirir. Örneğin:

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

log() veya log(format:, arguments:) öğelerinin nasıl kullanılacağı hakkında daha fazla bilgi için Crashlytics referans dokümanlarına bakın.

Objective-C

Sorunları belirlemek için log veya logWithFormat öğesini kullanın. İletilerle birlikte faydalı bir günlük çıktısı almak istiyorsanız her iki yönteme de ilettiğiniz nesnenin description örnek ö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'ı kullanma hakkında daha fazla bilgi için Crashlytics referans belgelerine bakın.

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

Bir sorunu teşhis etmek için genellikle kullanıcılarınızdan hangisinin belirli bir kilitlenme yaşadığını bilmek faydalıdır. 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ı, 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 temizlemeniz gerekirse değeri boş bir dizeye sıfırlayın. Kullanıcı tanımlayıcısının temizlenmesi mevcut kayıtları kaldırmaz.Crashlytics Bir kullanıcı kimliğiyle ilişkili kayıtları silmeniz gerekiyorsa Firebase destek ekibiyle iletişime geçin.

Önemli olmayan hata bildirme

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

NSError nesnelerini recordError yöntemiyle kaydederek ölümcül olmayan istisnaları kaydedebilirsiniz. recordError, [NSThread callStackReturnAddresses]'ı çağırarak iş parçacığının ç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'ın kilitlenmeleri 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'nin uygulamanızla ilgili kaydedilen hataların raporlanmasını sınırlamasına yol açabilir.

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 ölümcül kilitlenmelerin aksine, kaydedilen hatalar domain ve code'ye göre gruplandırılır. Bu, önemli bir farktır. Örneğin:

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 ile gruplandırılmış yeni bir sorun oluşturulur. Aynı alan ve kod değerlerini kullanan ek olarak kaydedilmiş hatalar aynı sorun altında gruplandırılır. userInfo nesnesinde bulunan veriler, anahtar/değer çiftlerine dönüştürülür ve tek bir sorundaki anahtarlar/günlükler bölümünde gösterilir.

Günlükler ve özel anahtarlar

Kilitlenme raporlarında olduğu gibi, günlükleri ve özel anahtarları yerleştirerek NSError bağlam ekleyebilirsiniz. Ancak, çökmelere ve kaydedilen hatalara eklenen günlükler arasında fark vardır. Kilitlenme meydana geldiğinde ve uygulama yeniden başlatıldığında, diskten alınan Crashlytics günlükleri, kilitlenme anına kadar yazılan günlüklerdir. NSError günlüğe kaydettiğinizde uygulama hemen sonlandırılmaz. Crashlytics yalnızca bir sonraki uygulama başlatma işleminde kaydedilen hata raporunu gönderdiğinden ve diskteki günlükler için ayrılan alan miktarını sınırlaması gerektiğinden, NSError kaydedildikten sonra yeterli günlük kaydedilebilir. Böylece, Crashlytics raporu cihazdan gönderdiğinde ilgili tüm günlükler döndürülmüş olur. NSErrors günlüğe kaydederken ve uygulamanızda günlükleri ve özel anahtarları kullanırken bu dengeyi göz önünde bulundurun.

Performansla ilgili konular

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

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

NSException'lar ne olacak?

Crashlytics, NSException örneklerini doğrudan günlüğe kaydetme ve kaydetme olanağı sunmaz. Genel olarak Cocoa ve Cocoa Touch API'leri istisna güvenli değildir. Bu nedenle, @catch çok dikkatli kullanıldığında bile sürecinizde çok ciddi istenmeyen yan etkiler olabilir. Kodunuzda hiçbir zaman @catch ifadelerini kullanmamalısınız. Lütfen bu konuyla ilgili Apple'ın belgelerine bakın.

Yığın izlemelerini özelleştirme

Uygulamanız yerel olmayan bir ortamda (ör. C++ veya Unity) çalışıyorsa uygulamanızın yerel istisna biçiminde kilitlenme meta verilerini bildirmek için Exception Model API'yi kullanabilirsiniz. Bildirilen istisnalar, ölümcül olmayan hatalar 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 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

Breadcrumb günlükleri, bir kullanıcının kilitlenme, ölümcül olmayan veya ANR etkinliğine yol açan uygulama etkileşimleri hakkında daha iyi bilgi edinmenizi sağlar. Bu günlükler, bir sorunu yeniden oluşturmaya ve hata ayıklamaya çalışırken faydalı olabilir.

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

Analytics SDK'sı, screen_view etkinliğini otomatik olarak günlüğe kaydeder. Bu sayede, kilitlenme, ölümcül olmayan veya ANR etkinliğinden önce görüntülenen ekranların listesini göstermek için izleme kaydı günlükleri kullanılabilir. screen_view izleme kaydı, firebase_screen_class parametresini içeriyor.

Ayrıca, kullanıcı oturumunda manuel olarak günlüğe kaydettiğiniz tüm özel etkinlikler (etkinliğin parametre verileri dahil) ile de izleme kaydı günlükleri doldurulur. Bu veriler, kilitlenme, ölümcül olmayan veya ANR etkinliğine yol açan bir dizi kullanıcı işlemini göstermeye yardımcı olabilir.

Google Analytics verilerinin toplanmasını ve kullanılmasını kontrol edebileceğinizi unutmayın. Bu veriler, izleme kaydı günlüklerini dolduran verileri de içerir.

Etkinleştirme raporlamasını etkinleştirme

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 olanağı sunmak için otomatik raporlamayı devre dışı bırakıp yalnızca kodunuzda seçtiğiniz zaman Crashlytics'a veri göndererek izinli raporlamayı etkinleştirebilirsiniz.

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

    • Tuş: FirebaseCrashlyticsCollectionEnabled
    • Değer: false
  2. Çalışma zamanında Crashlytics data collection geçersiz kılma işlevini çağırarak belirli kullanıcılar için veri toplamayı etkinleştirin. Geçersiz kılma değeri, uygulamanızın sonraki tüm başlatma işlemleri boyunca geçerli olur. Böylece Crashlytics, söz konusu kullanıcı için raporları otomatik olarak toplayabilir.

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

    Kullanıcı daha sonra veri toplamayı devre dışı bırakırsa geçersiz kılma değeri olarak false değerini iletebilirsiniz. Bu değer, kullanıcı uygulamayı bir sonraki kez başlattığında uygulanır ve bu kullanıcının sonraki tüm başlatma işlemleri için geçerli olmaya devam eder.

Kilitlenme analizleri verilerini yönetme

Kilitlenme analizleri, anonimleştirilmiş yığın izlemelerinizi diğer Firebase uygulamalarındaki izlemelerle karşılaştırarak sorunları çözmenize yardımcı olur ve sorununuzun daha büyük bir trendin parçası olup olmadığını bildirir. Kilitlenme Analizleri, birçok sorunda kilitlenmeyi ayıklamanıza yardımcı olacak kaynaklar da sunar.

Kilitlenme Analizleri, 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 Çökme Analizleri menüsünden Çökme Analizleri'ni devre dışı bırakabilirsiniz.