Catch up on everything announced at Firebase Summit, and learn how Firebase can help you accelerate app development and run your app with confidence. Learn More

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

Koleksiyonlar ile düzeninizi koruyun İçeriği tercihlerinize göre kaydedin ve kategorilere ayırın.

Bu kılavuz, Firebase Crashlytics SDK'yı kullanarak kilitlenme raporlarınızı nasıl özelleştireceğinizi açıklar. Varsayılan olarak Crashlytics, uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar (bunun yerine otomatik kilitlenme raporlamasını kapatabilir ve kullanıcılarınız için katılım raporlamasını etkinleştirebilirsiniz ). Crashlytics, kullanıma hazır dört günlüğe kaydetme mekanizması sağlar: özel anahtarlar , özel günlükler , kullanıcı tanımlayıcıları ve yakalanan istisnalar .

Özel anahtarlar ekle

Özel anahtarlar, uygulamanızın çökmeye neden olan belirli durumunu anlamanıza yardımcı olur. Rastgele anahtar/değer çiftlerini kilitlenme raporlarınızla ilişkilendirebilir, ardından Firebase konsolunda kilitlenme raporlarını aramak ve filtrelemek için özel anahtarları kullanabilirsiniz.

  • Crashlytics panosunda , özel bir anahtarla eşleşen sorunları arayabilirsiniz.
  • Konsolda belirli bir sorunu incelerken, her olay için ilişkili özel anahtarları görüntüleyebilir ( Anahtarlar alt sekmesi) ve hatta olayları ö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ı, boolean'ları veya kayan 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. Ö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 bir NSDictionary ile 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 neden olan olaylar hakkında kendinize daha fazla bağlam sağlamak 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() öğesine ilettiğiniz nesne CustomStringConvertible özelliğine uymalı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:) 'nin nasıl kullanılacağı hakkında daha fazla ayrıntı için Crashlytics başvuru belgelerine bakın.

Amaç-C

Sorunları saptamaya yardımcı olması için log veya logWithFormat kullanın. Mesajlarla birlikte 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 başvuru belgelerine bakın.

Kullanıcı tanımlayıcılarını ayarla

Bir sorunu teşhis etmek için, hangi kullanıcılarınızın belirli bir kilitlenme yaşadığını bilmek genellikle yardımcı 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ı, jeton veya karma değer biçiminde benzersiz bir tanımlayıcı atayın:

Süratli

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

Amaç-C

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

Ayarladıktan sonra bir kullanıcı tanımlayıcısını 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 desteği ile iletişime geçin .

tutucu98 l10n-yer

Önemli olmayan istisnaları bildirin

Crashlytics, uygulamanızın çökmelerini otomatik olarak bildirmenin yanı sıra, önemli olmayan istisnaları kaydetmenize ve uygulamanız 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] ç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 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.

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

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

Yığın izleme analizi yoluyla gruplanan önemli çökmelerin aksine, günlüğe kaydedilen hatalar domain ve code göre gruplanı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ılmış yeni bir sorun oluşturur. Aynı etki alanını ve kod değerlerini kullanan ek günlüğe kaydedilen hatalar aynı sorun altında gruplanı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

Tıpkı 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, çökme anına kadar yazılmış olan günlüklerdir. Bir NSError , uygulama hemen sonlandırılmaz. Crashlytics yalnızca günlüğe kaydedilen hata raporunu bir sonraki uygulama açılışında gönderdiğinden ve diskteki günlükler için ayrılan alan miktarını sınırlaması gerektiğinden, bir NSError kaydedildikten sonra, Crashlytics'in gönderdiği zamana kadar ilgili tüm günlüklerin döndürülmesi için yeterince oturum açmak mümkündür. cihazdan gelen rapor. NSErrors kaydederken ve uygulamanızda günlükleri ve özel anahtarları kullanırken bu dengeyi göz önünde bulundurun.

Performans konuları

Bir NSError 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 (arm64 ve x86) destekleyen mimarilerde CPU ve G/Ç açısından yoğun olabilir. Çözme işlemi tamamlandıktan sonra, bilgiler diske eşzamanlı olarak 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 izleme bağlamını kaybettiğini unutmayın.

NSException'lar ne olacak?

Crashlytics, NSException örneklerini doğrudan günlüğe kaydetme ve kaydetme olanağı sunmaz. Genel olarak konuşursak, Cocoa ve Cocoa Touch API'leri istisnai olarak güvenli değildir. Bu, @catch kullanımının, aşırı 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 olarak Apple'ın belgelerine bakın.

tutucu104 l10n-yer

Yığın izlerini özelleştirin

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 İ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 de yalnızca adreslerle 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];

Kaydolma 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 yalnızca kodunuzda seçtiğinizde Crashlytics'e veri göndererek katılım raporlamasını 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 toplama geçersiz kılmayı çağırarak belirli kullanıcılar için toplamayı etkinleştirin. Geçersiz kılma değeri, uygulamanızın lansmanları 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 izlemelerinizi diğer Firebase uygulamalarından gelen izlemelerle karşılaştırarak ve sorununuzun daha büyük bir trendin parçası olup olmadığını size bildirerek sorunları çözmenize yardımcı olur. Birçok sorun için Crash Insights, kilitlenmede hata ayıklamanıza yardımcı olacak kaynaklar bile 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 ederseniz, Firebase konsolundaki Crashlytics sorun listenizin üst kısmındaki Crash Insights menüsünden Crash Insights'ı devre dışı bırakabilirsiniz.