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ı özel anahtarlar, özel günlük mesajları ve kullanıcı tanımlayıcıları kaydedecek şekilde ayarlayın.
Crashlytics için istisnaları bildirin.
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.
Info.plist
dosyanıza yeni bir anahtar ekleyerek otomatik toplamayı devre dışı bırakın:- Tuş:
FirebaseCrashlyticsCollectionEnabled
- Değer:
false
- Tuş:
Ç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.