Crashlytics kontrol panelinde bir sorunu tıklayıp ayrıntılı etkinlik raporu alabilirsiniz. Bu raporları, uygulamanızda neler olduğunu ve Crashlytics hesabına bildirilen etkinliklerle ilgili durumları daha iyi anlamanıza yardımcı olacak şekilde özelleştirebilirsiniz.
Uygulamanızı, özel anahtarları, özel günlük mesajlarını ve kullanıcı tanımlayıcılarını günlüğe kaydetecek şekilde donatın.
İstisnaları Crashlytics'e bildirin.
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 etkinlikle sonuçlanan kullanıcı işlemlerini görmenizi sağlar.
Otomatik kilitlenme raporlamasını devre dışı bırakın ve kullanıcılarınız için etkinleştirme raporlamasını etkinleştirin. Crashlytics'ün varsayılan olarak uygulamanızın tüm kullanıcılarının kilitlenme raporlarını otomatik olarak topladığını unutmayın.
Özel anahtar ekleme
Özel anahtarlar, kilitlenmeye yol açan uygulama durumunu öğrenmenize yardımcı olur. İsteğe bağlı 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 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, 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ğerleri 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"];
Ayrıca, mevcut bir anahtarı çağırıp farklı bir değere ayarlayarak anahtarın değerini 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 kullanarak 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 Günlükler sekmesinde Crashlytics sayfasında gösterir.
Swift
Sorunları tespit etmek için log()
veya log(format:, arguments:)
simgesini kullanın. Mesajlar içeren yararlı bir günlük çıkışı almak istiyorsanız log()
'e ilettiğiniz nesne CustomStringConvertible
mülküne 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çimlendiriyor. Örneğin:
Crashlytics.crashlytics().log(format: "%@, %@", arguments: getVaList(["Higgs-Boson detected! Bailing out…", attributesDict]))
log()
veya log(format:, arguments:)
kullanımıyla ilgili daha ayrıntılı bilgi için Crashlytics
referans belgelerine bakın.
Objective-C
Sorunların belirlenmesine yardımcı olması için log
veya logWithFormat
kullanın. Mesajlarla faydalı bir günlük çıkışı almak istiyorsanız iki yöntemden birine 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
'un nasıl kullanılacağı hakkında daha fazla bilgi için Crashlytics referans dokümanlarına bakın.
Kullanıcı tanımlayıcıları ayarlama
Bir sorunu teşhis etmek için genellikle hangi kullanıcılarınızın belirli bir kilitlenme yaşadığını bilmek yararlıdır. 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 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 onu temizlemeniz gerekirse değeri boş bir dizeye sıfırlayın. Kullanıcı tanımlayıcısı temizlendiğinde mevcut Crashlytics kayıtları kaldırılmaz. Bir kullanıcı kimliğiyle ilişkili kayıtları silmeniz gerekiyorsa Firebase destek ekibiyle iletişime geçin.
Önemli olmayan istisnaları bildirme
Crashlytics, uygulamanızın kilitlenmelerini otomatik olarak bildirmenin yanı sıra önemli olmayan istisnaları kaydetmenize olanak tanır ve uygulamanız bir sonraki sefer açıldığında bunları size gönderir.
recordError
yöntemiyle NSError
nesnelerini kaydederek ölümcül olmayan istisnaları kaydedebilirsiniz. recordError
, [NSThread callStackReturnAddresses]
çağrısı yaparak 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'nin kilitlenmeleri gruplandırmak için verileri nasıl kullandığını anlamak önemlidir. recordError
yönteminin yanlış kullanılması, öngörülemeyen davranışlara neden olabilir ve Crashlytics'ın, uygulamanız için 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 analizi aracılığıyla gruplandırılan ölümcül kilitlenmelerin aksine, günlüğe kaydedilen hatalar domain
ve code
'ye 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
'ye göre gruplandırılmış yeni bir sorun oluşturulur. Aynı alan ve kod değerlerini kullanan diğer günlüğe kaydedilen 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, NSError
'e bağlam eklemek için günlükler ve özel anahtarlar yerleştirebilirsiniz. Ancak kilitlenmelere ve günlüklenen hatalara hangi günlüklerin eklendiği arasında bir fark vardır. Bir kilitlenme meydana geldiğinde ve uygulama yeniden başlatıldığında, Crashlytics'ın diskten aldığı günlükler, kilitlenme zamanına kadar yazılmış olanlardır. NSError
günlüğe kaydedildiğinde uygulama hemen sonlandırılmaz. Crashlytics, yalnızca bir sonraki uygulama başlatıldığında günlüğe kaydedilen hata raporunu gönderir ve diskteki günlükler için ayrılan alan miktarını sınırlaması gerekir. Bu nedenle, bir NSError
kaydedildikten sonra yeterli günlük kaydı yapmak mümkündür. Böylece, Crashlytics raporu cihazdan gönderene kadar tüm ilgili günlükler silinir. Uygulamanızda NSErrors
günlük kaydı oluştururken ve 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 pahalı olabileceğini unutmayın. Çağrıyı yaptığınız sırada Crashlytics, yığın geri alma adlı bir işlemi kullanarak mevcut iş parçacığının çağrı yığınını yakalar. Bu işlem, özellikle DWARF açma işlemini destekleyen mimarilerde (arm64 ve x86) yoğun CPU ve G/Ç kullanımı gerektirebilir.
Sarma işlemi tamamlandıktan sonra bilgiler diske senkronize olarak yazılır.
Bu, bir sonraki satırın kilitlenmesi durumunda veri kaybını önler.
Bu API'yi arka plan iş parçacığında çağırmak güvenli olsa da bu çağrının başka bir kuyruğa gönderilmesinin mevcut yığın izleme bağlamını kaybettiğini unutmayın.
NSExceptions nedir?
Crashlytics, doğrudan NSException
örneklerini günlüğe kaydetme ve kaydetme olanağı sunmaz. Genel olarak Cocoa ve Cocoa Touch API'leri istisnalardan korunaklı değildir. Bu, @catch
'ün son derece dikkatli bir şekilde kullanıldığında bile işleminizde istenmeyen çok ciddi yan etkileri olabileceği anlamına gelir. Kodunuzda hiçbir zaman @catch
ifadeleri kullanmamalısınız. Lütfen konuyla ilgili Apple'ın belgelerini inceleyin.
Yığın izlemelerini ö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, kritik olmayan 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
Kırıntı günlükleri, kullanıcının uygulamanızla yaptığı ve kilitlenme, ölümcül olmayan veya ANR etkinliğine yol açan etkileşimleri daha iyi anlamanızı sağlar. Bu günlükler, bir sorunu yeniden oluşturmaya ve hata ayıklamaya çalışırken faydalı olabilir.
Kırıntı günlükleri Google Analytics tarafından desteklenir. Bu nedenle, breadcrumb günlüklerini almak için Firebase projeniz için Google Analytics'i etkinleştirmeniz ve Google Analytics için Firebase SDK'sını uygulamanıza eklemeniz gerekir. Bu koşullar karşılandığında, bir sorunun ayrıntılarını görüntülediğinizde breadcrumb günlükleri, Günlükler sekmesindeki bir etkinliğin verilerine otomatik olarak eklenir.
Analytics SDK'sı screen_view
etkinliğini otomatik olarak günlüğe kaydeder. Bu etkinlik, içerik haritası günlüklerinde kilitlenme, önemli olmayan veya ANR etkinliğinden önce görüntülenen ekranların listesini göstermesini sağlar. screen_view
içerik haritası günlüğü firebase_screen_class
parametresi içeriyor.
Kırıntı günlükleri, etkinliğin parametre verileri de dahil olmak üzere kullanıcının oturumunda manuel olarak kaydettiğiniz tüm özel etkinliklerle de doldurulur. Bu veriler, kilitlenmeye, ölümcül olmayan bir kilitlenmeye 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 arasında, içerik haritası günlüklerini dolduran veriler de bulunur.
Kayıt raporlamayı etkinleştir
Varsayılan olarak Crashlytics, uygulamanızın tüm kullanıcıları için kilitlenme raporlarını otomatik olarak toplar. Kullanıcıların gönderdikleri veriler üzerinde daha fazla kontrol sahibi olmaları için otomatik raporlamayı devre dışı bırakıp yalnızca kodunuzda istediğiniz zaman Crashlytics adresine veri göndererek kayıt raporlamayı etkinleştirebilirsiniz:
Info.plist
dosyanıza yeni bir anahtar ekleyerek otomatik toplamayı devre dışı bırakın:- Anahtar:
FirebaseCrashlyticsCollectionEnabled
- Değer:
false
- Anahtar:
Çalışma zamanında Crashlytics veri toplama geçersiz kılma işlevini çağırarak veri toplamayı belirli kullanıcılar için etkinleştirin. Üzeride yazılan değer, uygulamanızın lansmanlarında 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
'ü iletin.false
olarak ayarlandığında yeni değer, uygulamanın bir sonraki çalıştırılmasına kadar uygulanmaz.Swift
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
Crash Insights verilerini yönetme
Kilitlenme Analizleri, 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ı bildirerek sorunları çözmenize yardımcı olur. Kilitlenme Analizleri, birçok sorun için kilitlenmeyi ayıklamanıza yardımcı olacak kaynaklar bile 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 istemezseniz Firebase konsolunda Crashlytics sorun listenizin üst kısmındaki Kilitlenme Analizleri menüsünden Kilitlenme Analizleri'ni devre dışı bırakabilirsiniz.