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

Crashlytics kontrol panelinde bir sorunu tıklayıp ayrıntılı etkinlik raporu alabilirsiniz. Uygulamanızda neler olduğunu ve Crashlytics'e bildirilen etkinliklerle ilgili koşulları daha iyi anlamanıza yardımcı olması 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şlemlerini görebilmenizi sağlar.

  • Otomatik kilitlenme raporlamasını kapatın ve kullanıcılarınız için kaydolma raporlarını etkinleştirin. Varsayılan olarak Crashlytics, uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar.

Özel anahtar ekle

Özel anahtarlar, uygulamanızın kilitlenmeye yol açan belirli 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ı arayabilir ve filtreleyebilirsiniz.

  • Crashlytics kontrol panelinde, özel bir anahtarla eşleşen sorunları arayabilirsiniz.
  • Konsolda belirli bir sorunu incelerken, her bir 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. Ö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

Tamsayı, boole 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"];

Mevcut bir anahtarın değerini, anahtarı çağırarak ve farklı bir değere ayarlayarak da 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 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ı ekleyin

Kilitlenmeye yol açan olaylarla ilgili daha fazla bağlam bilgisi 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 yararlı bir günlük çıkışı almak istiyorsanız log() öğesine ilettiğiniz nesnenin CustomStringConvertible özelliğine uyması 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)")

getVaList() çağrısının döndürdüğü .log(format:, arguments:) biçimleri değerler. Örnek:

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

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

Objective-C

Sorunların belirlenmesine yardımcı olması için log veya logWithFormat kullanın. Mesajlarla yararlı bir günlük çıkışı almak istiyorsanız her iki yönteme 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 öğelerinin nasıl kullanılacağı hakkında daha fazla bilgi için Crashlytics referans belgelerine bakın.

Kullanıcı tanımlayıcıları 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ımlamanızı sağlayan bir yol sunar.

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ş 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ızdaki kilitlenmeleri otomatik olarak bildirmenin yanı sıra, önemli olmayan istisnaları kaydetmenize olanak tanır ve uygulamanızın bir sonraki açılışında bu istisnaları size gönderir.

recordError yöntemiyle NSError nesneleri kaydederek önemli olmayan istisnaları kaydedebilirsiniz. recordError, [NSThread callStackReturnAddresses] yöntemini çağırarak 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 gruplandırmak için verileri nasıl kullandığını anlamak önemlidir. recordError yönteminin yanlış kullanımı, tahmin edilemez davranışa 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 üç bağımsız değişkeni vardır:

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

Yığın izleme analizi yoluyla gruplandırılan önemli kilitlenmelerin aksine, günlüğe kaydedilen hatalar domain ve code bazında gruplanır. Bu, önemli kilitlenmeler ile günlüğe kaydedilen hatalar arasındaki önemli bir farktı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. Günlüğe kaydedilen ve aynı alan ve kod değerlerini kullanan diğer hatalar aynı sorun altında gruplandırılır. userInfo nesnesinde bulunan veriler, anahtar/değer çiftlerine dönüştürülür ve bağımsız bir sorun içindeki anahtarlar/günlükler bölümünde gösterilir.

Günlükler ve özel anahtarlar

Kilitlenme raporlarında olduğu gibi, NSError aracına bağlam eklemek için günlükler 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 gerçekleştiğinde ve uygulama yeniden başlatıldığında, Crashlytics'in diskten aldığı günlükler, kilitlenme anına kadarki günlük kayıtlarıdır. Bir NSError öğesini günlüğe kaydettiğinizde uygulama hemen sonlandırılmaz. Crashlytics yalnızca bir sonraki uygulama lansmanında günlüğe kaydedilen hata raporunu gönderdiğinden ve diskteki günlükler için ayrılan alanı sınırlaması gerektiğinden, NSError kaydedildikten sonra yeterince günlük kaydı yapılabilir. Böylece Crashlytics, raporu cihazdan gönderene kadar ilgili tüm günlükler döndürülür. NSErrors uygulamasını 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 için günlüğe kaydetmenin oldukça pahalı olabileceğini unutmayın. Siz çağrıyı yaparken Crashlytics, yığın gevşetme adı verilen bir işlemi kullanarak mevcut iş parçacığının çağrı yığınını yakalar. Bu işlem, özellikle DWARF geri alma işlemini destekleyen mimarilerde (arm64 ve x86) yoğun CPU ve G/Ç gerektirebilir. Gevşeme işlemi tamamlandıktan sonra bilgiler eşzamanlı olarak diske yazılır. Bu sayede, bir sonraki satırın kilitlenmesi durumunda veri kaybı yaşanmaz.

Bu API'yi bir arka plan iş parçacığında çağırmak güvenli olsa da, bu çağrıyı başka bir sıraya göndermenin mevcut yığın izleme 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 istisna açısından güvenli değildir. Bu durum, @catch kullanımının, son derece dikkatli kullanıldığında bile sürecinizde çok ciddi, istenmeyen yan etkileri olabileceği anlamına gelir. Kodunuzda hiçbir zaman @catch ifadeleri kullanmamalısınız. Lütfen konuyla ilgili Apple'ın belgelerine bakın.

Yığın izlemeyi özelleştir

Uygulamanız yerel olmayan bir ortamda (ör. C++ veya Unity) ç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 adreslerle 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ızla, kilitlenme, önemli olmayan veya ANR olaylarına neden olan etkileşimlerini daha iyi anlamanızı 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 desteklenmektedir. Bu nedenle, içerik haritası günlüklerini almak amacıyla Firebase projeniz için Google Analytics'i etkinleştirmeniz ve uygulamanıza Google Analytics için Firebase SDK'sını eklemeniz gerekir. Bu gereksinimler karşılandıktan sonra, sorunun ayrıntılarını görüntülediğinizde içerik haritası günlükleri, etkinlik verilerine otomatik olarak eklenir. Günlükler sekmesine eklenir.

Analytics SDK'sı, screen_view etkinliğini otomatik olarak günlüğe kaydeder. Böylece içerik haritası günlüklerinde, kilitlenme, önemli olmayan veya ANR etkinliğinden önce görüntülenen ekranların listesi gösterilir. screen_view içerik haritası günlüğü, firebase_screen_class parametresi içerir.

İçerik haritası günlükleri, etkinliğin parametre verileri dahil olmak üzere, kullanıcının oturumunda manuel olarak günlüğe kaydettiğiniz tüm özel etkinliklerle de doldurulur. Bu veriler; kilitlenme, önemli olmayan veya ANR etkinliğine yol açan 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ılmasını kontrol edebileceğinizi unutmayın.

Raporlamaya dahil olmayı 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 olanağı sağlamak için otomatik raporlamayı devre dışı bırakarak ve Crashlytics'e yalnızca kodunuzda istediğiniz zaman veri göndererek kayıt 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 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 her lansmanında aynı kalır. Böylece Crashlytics, raporları otomatik olarak toplayabilir.

    Otomatik kilitlenme raporları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 eğilimin parçası olup olmadığını size bildirerek sorunları çözmenize yardımcı olur. Crash Insights, birçok sorun için kilitlenme hatalarını ayıklamanıza yardımcı olacak kaynaklar da 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 konsolunda Crashlytics sorun listenizin üst kısmında bulunan Crash Insights menüsünden Kilitlenme Analizleri'ni devre dışı bırakabilirsiniz.