| Platform seçin: | iOS+ Android Flutter Unity |
Firebase konsolunun DevOps ve Etkileşim > Crashlytics kontrol panelinde bir sorunu tıklayarak ayrıntılı etkinlik raporu alabilirsiniz. Uygulamanızda neler olduğunu ve Crashlytics hizmetine bildirilen etkinliklerle ilgili koşulları daha iyi anlamanıza yardımcı olması için bu raporları özelleştirebilirsiniz.
Uygulamanızı özel anahtarları, özel günlük mesajlarını ve kullanıcı kimliklerini günlüğe kaydedecek şekilde yapılandırın.
İstisnaları Crashlytics adresine bildirin.
Uygulamanız Google Analytics için Firebase SDK'sını kullanıyorsa breadcrumb kayıtlarını 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 Crash Reporting'i devre dışı bırakın ve kullanıcılarınız için onaylı raporlamayı etkinleştirin. Crashlytics, varsayılan olarak uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar.
Özel anahtar ekleme
Özel anahtarlar, uygulamanızın kilitlenmeden önceki durumunu öğrenmenize yardımcı olur. Kilitlenme raporlarınızla rastgele anahtar/değer çiftlerini ilişkilendirebilir, ardından Firebase konsolunun DevOps ve Etkileşim > Crashlytics kontrol panelinde kilitlenme raporlarını aramak ve filtrelemek için özel anahtarları kullanabilirsiniz.
Ö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:
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ı, boole veya kayan nokta değerlerini 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 olaylar 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 bir sorunun ayrıntılarını görüntülediğinizde Günlükler sekmesinde gösterir (tüm sorunlarınızı Firebase Console'un DevOps ve Etkileşim > Crashlytics kontrol panelinde görebilirsiniz).
Swift
Sorunları tespit etmek için log() veya log(format:, arguments:) kullanın. Mesajlarla birlikte faydalı bir günlük çıkışı almak istiyorsanız log() yöntemine 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:) kullanımı hakkında daha fazla bilgi için Crashlytics
referans belgelerini inceleyin.
Objective-C
Sorunları tespit etmek için log veya logWithFormat kullanın. Mesajlarla birlikte faydalı bir günlük çıkışı 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 kullanımı hakkında daha fazla bilgi için Crashlytics referans belgelerine bakın.
Kullanıcı kimliklerini ayarlama
Bir sorunu teşhis etmek için genellikle hangi kullanıcılarınızın belirli bir kilitlenme sorunu yaşadığını bilmek faydalı olur. Crashlytics, kilitlenme raporlarınızda 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:
Swift
Crashlytics.crashlytics().setUserID("123456789")
Objective-C
[[FIRCrashlytics crashlytics] setUserID:@"123456789"];
Ayarladığınız bir kullanıcı kimliğini temizlemeniz gerekirse değeri boş bir dizeye sıfırlayın. Kullanıcı kimliğini temizlemek, mevcut Crashlytics kayıtlarını kaldırmaz. Bir kullanıcı kimliğiyle ilişkili kayıtları silmeniz gerekiyorsa Firebase Destek Ekibi ile iletişime geçin.
Önemli olmayan istisnaları 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.
recordError yöntemini kullanarak NSError nesnelerini kaydederek önemli olmayan istisnaları kaydedebilirsiniz. recordError, [NSThread callStackReturnAddresses] işlevini ç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 uygulamanız için günlüğe kaydedilen hataların raporlanmasını sınırlayabilir.
NSError nesnesinin üç bağımsız değişkeni vardır:
domain: Stringcode: IntuserInfo: [AnyHashable : Any]? = nil
Yığın izleme (stack trace) analizi aracılığıyla gruplandırılan önemli kilitlenmelerin aksine, günlüğe kaydedilen hatalar domain ve code'e göre gruplandırılır. Bu, önemli kilitlenmeler ile günlüğe
kaydedilen hatalar arasındaki ö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 gruplandırma ölçütlerine göre gruplandırılmış yeni bir sorun oluşturulur. Aynı alan ve kod değerlerini kullanan diğer günlük kaydı yapılan hatalar aynı sorun altında gruplandırılır. userInfo nesnesinde bulunan veriler, anahtar/değer çiftlerine dönüştürülür ve her bir sorunun anahtarlar/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 ve günlüğe kaydedilen hatalara eklenen günlükler arasında fark vardır. Bir kilitlenme meydana geldiğinde ve uygulama yeniden başlatıldığında, Crashlytics tarafından diskten alınan günlükler, kilitlenme anına kadar yazılan 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 başlatma işleminde gönderdiğinden ve diskte günlükler için ayrılan alan miktarını sınırlaması gerektiğinden, bir NSError kaydedildikten sonra yeterli miktarda günlük kaydı yapılabilir. Böylece, Crashlytics cihazdan raporu gönderene kadar ilgili tüm günlükler dönüşümlü olarak değiştirilir. Uygulamanızda NSErrors kaydederken ve günlükler ile özel anahtarları kullanırken bu dengeyi göz önünde bulundurun.
Performansla ilgili konular
NSError kaydetmenin oldukça maliyetli olabileceğini unutmayın. Çağrıyı yaptığınız sırada Crashlytics, yığın açma adı verilen bir işlem kullanarak 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 alma işlemi tamamlandıktan sonra bilgiler diske eşzamanlı olarak yazılır.
Bu sayede, bir sonraki satırda kilitlenme yaşanırsa veri kaybı önlenir.
Bu API'yi 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 izlemenin bağlamını kaybettirdiğini unutmayın.
Peki ya NSExceptions?
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 nedenle, @catch kullanımı, son derece dikkatli bir şekilde kullanılsa bile sürecinizde istenmeyen çok ciddi yan etkilere neden olabilir. Kodunuzda hiçbir zaman @catch ifadeleri kullanmamalısınız. Konuyla ilgili Apple'ın belgelerini inceleyin.
Yığın izlemeleri ö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 olmayan sorunlar 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];
Breadcrumb günlüklerini alma
Breadcrumb kayıtları, bir kullanıcının kilitlenme, önemli olmayan hata veya ANR etkinliğine yol açan uygulama 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.
Breadcrumb kayıtları Google Analytics tarafından desteklenir. Bu nedenle, breadcrumb kayıtlarını almak için Firebase projenizde Google Analytics'i etkinleştirmeniz ve uygulamanıza Google Analytics için Firebase SDK'sını eklemeniz gerekir. Bu koşullar karşılandıktan sonra, bir sorunun ayrıntılarını görüntülerken breadcrumb kayıtları Kayıtlar sekmesindeki etkinlik verilerine otomatik olarak dahil edilir (Tüm sorunlarınızı Firebase konsolunun DevOps ve Etkileşim > Crashlytics kontrol panelinde görebilirsiniz).
Analytics SDK'sı, screen_view etkinliğini otomatik olarak günlüğe kaydeder. Bu sayede breadcrumb kayıtları, kilitlenme, önemli olmayan hata veya ANR etkinliğinden önce görüntülenen ekranların listesini gösterebilir. screen_view breadcrumb kaydı, firebase_screen_class parametresi içeriyor.
Breadcrumb günlükleri, kullanıcının oturumu içinde manuel olarak günlüğe kaydettiğiniz tüm özel etkinliklerle (etkinliğin parametre verileri dahil) de doldurulur. Bu veriler, kilitlenme, önemli olmayan hata veya ANR etkinliğine yol açan bir dizi kullanıcı işlemini gösterebilir.
Breadcrumb kayıtlarını dolduran veriler de dahil olmak üzere Google Analytics verilerinin toplanmasını ve kullanılmasını kontrol edebileceğinizi unutmayın.
Etkinleştirme raporlamasını etkinleştirme
Crashlytics, uygulamanızın tüm kullanıcıları için kilitlenme raporlarını varsayılan olarak otomatik olarak toplar. Kullanıcılara gönderdikleri veriler üzerinde daha fazla kontrol sağlamak için otomatik raporlamayı devre dışı bırakıp yalnızca kodunuzda seçtiğiniz zamanlarda Crashlytics'e veri göndererek raporlamaya dahil olmayı etkinleştirebilirsiniz.
Info.plistdosyanıza yeni bir anahtar ekleyerek otomatik toplamayı devre dışı bırakın:- Tuş:
FirebaseCrashlyticsCollectionEnabled - Değer:
false
- Tuş:
Çalışma zamanında Crashlytics veri toplama 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şlemlerinde geçerli olur. Böylece Crashlytics, söz konusu kullanıcı için otomatik olarak rapor toplayabilir.
Swift
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
Kullanıcı daha sonra veri toplamayı kapsamı dışında kalmayı seçerse geçersiz kılma değeri olarak
falsedeğerini iletebilirsiniz. Bu değer, kullanıcı uygulamayı bir sonraki başlatışında uygulanır ve kullanıcının sonraki tüm başlatma işlemlerinde geçerli olur.
Crash Insights verilerini yönetme
Crash Insights, anonimleştirilmiş yığın izlemelerinizi diğer Firebase uygulamalarından alınan 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. Crash Insights, birçok sorun için kilitlenmeyle ilgili hata 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 konsolunun DevOps ve Etkileşim > Crashlytics kontrol panelindeki sorun listesinin üst kısmında bulunan Crash Insights menüsünden Crash Insights'ı devre dışı bırakabilirsiniz.
Sonraki adımlar
- Verilerinizi BigQuery veya Cloud Logging platformuna aktararak verilerinizi sorgulama, özel kontrol panelleri oluşturma ve özel uyarılar ayarlama gibi gelişmiş analiz ve özelliklerden yararlanın.