Catch up on everthing we announced at this year's Firebase Summit. Learn more

अपनी Firebase Crashlytics क्रैश रिपोर्ट कस्टमाइज़ करें

यह मार्गदर्शिका बताती है कि Firebase Crashlytics SDK का उपयोग करके अपनी क्रैश रिपोर्ट को कैसे कस्टमाइज़ किया जाए। डिफ़ॉल्ट रूप से, Crashlytics स्वचालित रूप से क्रैश रिपोर्ट सभी अपने ऐप्लिकेशन के उपयोगकर्ताओं (आप स्वत: क्रैश रिपोर्टिंग बंद कर देते हैं और कर सकते हैं के लिए एकत्र करता है रिपोर्टिंग में ऑप्ट सक्षम बजाय अपने उपयोगकर्ताओं के लिए)। : Crashlytics बॉक्स से बाहर चार प्रवेश तंत्र प्रदान करता है कस्टम कुंजी , कस्टम लॉग , उपयोगकर्ता पहचानकर्ता , और पकड़ा अपवाद

कस्टम कुंजियाँ जोड़ें

कस्टम कुंजियाँ क्रैश होने तक आपके ऐप की विशिष्ट स्थिति प्राप्त करने में आपकी सहायता करती हैं। आप अपनी क्रैश रिपोर्ट के साथ मनमानी कुंजी/मान युग्म संबद्ध कर सकते हैं, फिर Firebase कंसोल में क्रैश रिपोर्ट खोजने और फ़िल्टर करने के लिए कस्टम कुंजियों का उपयोग कर सकते हैं।

  • में Crashlytics डैशबोर्ड , आप मुद्दों है कि एक कस्टम कुंजी के मिलान के लिए खोज सकते हैं।
  • आप कंसोल में एक विशिष्ट समस्या की समीक्षा कर रहे हैं, तो आप प्रत्येक घटना (कुंजी उपटैब) और यहां तक कि कस्टम कुंजी द्वारा घटनाओं को फिल्टर (पेज के शीर्ष पर फ़िल्टर मेनू) के लिए जुड़े कस्टम कुंजी देख सकते हैं।

का प्रयोग करें setCustomValue सेट कुंजी / मान जोड़े के लिए विधि। उदाहरण के लिए:

तीव्र

// Set int_key to 100.
Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set str_key to "hello".
Crashlytics.crashlytics().setCustomValue("hello", forKey: "str_key")

उद्देश्य सी

जब पूर्णांक, बूलियन्स, या तैरता की स्थापना, बॉक्स के रूप में मूल्य @( value )

// Set int_key to 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set str_key to "hello".
[[FIRCrashlytics crashlytics] setCustomValue:@"hello" forKey:@"str_key"];

आप कुंजी को कॉल करके और इसे किसी भिन्न मान पर सेट करके किसी मौजूदा कुंजी के मान को संशोधित भी कर सकते हैं। उदाहरण के लिए:

तीव्र

Crashlytics.crashlytics().setCustomValue(100, forKey: "int_key")

// Set int_key to 50 from 100.
Crashlytics.crashlytics().setCustomValue(50, forKey: "int_key")

उद्देश्य सी

[[FIRCrashlytics crashlytics] setCustomValue:@(100) forKey:@"int_key"];

// Set int_key to 50 from 100.
[[FIRCrashlytics crashlytics] setCustomValue:@(50) forKey:@"int_key"];

का उपयोग करके थोक में कुंजी / मान जोड़े जोड़े setCustomKeysAndValues केवल पैरामीटर के रूप में एक NSDictionary साथ विधि:

तीव्र

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)

उद्देश्य सी

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];

कस्टम लॉग संदेश जोड़ें

क्रैश होने वाली घटनाओं के लिए स्वयं को अधिक संदर्भ देने के लिए, आप अपने ऐप में कस्टम क्रैशलाईटिक्स लॉग जोड़ सकते हैं। Crashlytics साथियों के Crashlytics पृष्ठ में अपने क्रैश डेटा और उन्हें प्रदर्शित करता है के साथ लॉग Firebase कंसोल , लॉग्स टैब के अंतर्गत।

तीव्र

उपयोग log() या log(format:, arguments:) मदद सटीक मुद्दों के लिए। आप संदेश के साथ एक उपयोगी लॉग उत्पादन प्राप्त करना चाहते हैं, वस्तु आप के पास है कि log() के अनुरूप होना चाहिए CustomStringConvertible संपत्ति। log() वर्णन संपत्ति आप वस्तु के लिए परिभाषित देता है। उदाहरण के लिए:

Crashlytics.crashlytics().log("Higgs-Boson detected! Bailing out…, \(attributesDict)")

.log(format:, arguments:) प्रारूपों मूल्यों को कॉल करने से लौटे getVaList() । उदाहरण के लिए:

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

उपयोग के बारे में अधिक जानकारी के लिए log() या log(format:, arguments:) , Crashlytics का उल्लेख संदर्भ दस्तावेज़

उद्देश्य सी

उपयोग log या logWithFormat मदद सटीक मुद्दों के लिए। ध्यान दें कि आप संदेश के साथ एक उपयोगी लॉग आउटपुट प्राप्त करना चाहते हैं, उद्देश्य यह है कि आप किसी भी विधि को पारित ओवरराइड चाहिए description उदाहरण संपत्ति। उदाहरण के लिए:

[[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 और logWithFormat , Crashlytics का उल्लेख संदर्भ दस्तावेज़

उपयोगकर्ता पहचानकर्ता सेट करें

किसी समस्या का निदान करने के लिए, यह जानना अक्सर सहायक होता है कि आपके किस उपयोगकर्ता ने किसी क्रैश का अनुभव किया है। Crashlytics में आपकी क्रैश रिपोर्ट में अनाम रूप से उपयोगकर्ताओं की पहचान करने का एक तरीका शामिल है।

अपनी रिपोर्ट में उपयोगकर्ता आईडी जोड़ने के लिए, प्रत्येक उपयोगकर्ता को एक आईडी नंबर, टोकन या हैश मान के रूप में एक विशिष्ट पहचानकर्ता निर्दिष्ट करें:

तीव्र

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

उद्देश्य सी

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

यदि आपको किसी उपयोगकर्ता पहचानकर्ता को सेट करने के बाद उसे साफ़ करने की आवश्यकता है, तो मान को रिक्त स्ट्रिंग पर रीसेट करें। उपयोगकर्ता पहचानकर्ता को साफ़ करने से मौजूदा Crashlytics रिकॉर्ड नहीं हटते। यदि आप एक यूजर आईडी, के साथ जुड़े रिकॉर्ड को नष्ट करने की जरूरत है संपर्क Firebase समर्थन

गैर-घातक अपवादों की रिपोर्ट करें

आपके ऐप के क्रैश होने की स्वचालित रूप से रिपोर्ट करने के अलावा, Crashlytics आपको गैर-घातक अपवादों को रिकॉर्ड करने देता है और अगली बार आपका ऐप लॉन्च होने पर उन्हें आपको भेजता है।

आप को रिकॉर्ड करके गैर घातक अपवाद रिकॉर्ड कर सकते हैं NSError के साथ वस्तुओं recordError विधि। recordError फोन करके थ्रेड कॉल स्टैक कब्जा [NSThread callStackReturnAddresses]

तीव्र

Crashlytics.crashlytics().record(error: error)

उद्देश्य सी

[[FIRCrashlytics crashlytics] recordError:error];

का उपयोग करते समय recordError विधि है, यह समझना महत्वपूर्ण है NSError संरचना और कैसे Crashlytics समूह दुर्घटनाओं के लिए डेटा का उपयोग करता। का गलत उपयोग recordError विधि अप्रत्याशित व्यवहार का कारण बन सकती है और अपने अनुप्रयोग के लिए लॉग इन त्रुटियों की रिपोर्टिंग सीमित करने के Crashlytics हो सकती है।

एक NSError वस्तु तीन तर्क हैं:

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

घातक दुर्घटनाओं, जो स्टैक ट्रेस विश्लेषण के माध्यम से बांटा जाता है के विपरीत, लॉग इन त्रुटियों द्वारा वर्गीकृत किया है domain और code । यह घातक क्रैश और लॉग त्रुटियों के बीच एक महत्वपूर्ण अंतर है। उदाहरण के लिए:

तीव्र

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)

उद्देश्य सी

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];

जब आप त्रुटि ऊपर प्रवेश करें, तो यह एक नया मुद्दा यह है कि आधार पर वर्गीकृत किया जाता है बनाता है NSSomeErrorDomain और -1001 । समान डोमेन और कोड मानों का उपयोग करने वाली अतिरिक्त लॉग त्रुटियाँ एक ही समस्या के अंतर्गत समूहीकृत की जाती हैं। डाटा निहित भीतर userInfo वस्तु कुंजी-मान जोड़ों में बदल रही हैं और चाबी में दिखाया गया है / एक व्यक्ति मुद्दा भीतर अनुभाग लॉग करता है।

लॉग और कस्टम कुंजियाँ

बस क्रैश रिपोर्ट की तरह, आप एम्बेड कर सकते हैं लॉग और कस्टम कुंजी के लिए संदर्भ जोड़ना NSError । हालांकि, लॉग त्रुटियों बनाम क्रैश से जुड़े लॉग में अंतर है। जब कोई क्रैश होता है और ऐप को फिर से लॉन्च किया जाता है, तो Crashlytics डिस्क से पुनर्प्राप्त लॉग वे होते हैं जो क्रैश के समय तक लिखे गए थे। जब आप एक लॉग इन करें NSError , एप्लिकेशन तुरंत समाप्त नहीं करता है। Crashlytics केवल अगले एप्लिकेशन लॉन्च पर लॉग इन त्रुटि रिपोर्ट भेजता है और डिस्क पर लॉग के लिए आवंटित अंतरिक्ष की मात्रा को सीमित पड़ता है, इसलिए यह काफी लॉग इन करने के बाद एक संभव है NSError तो दर्ज की गई है कि सभी प्रासंगिक लॉग समय Crashlytics भेजता द्वारा बाहर घूम जाते हैं डिवाइस से रिपोर्ट। जब प्रवेश करने इसे ध्यान में संतुलन रखें NSErrors और अपने एप्लिकेशन में लॉग और कस्टम कुंजियों का उपयोग।

प्रदर्शन विचार

ध्यान रखें कि एक प्रवेश करने NSError काफी महंगा हो सकता है। जब आप कॉल करते हैं, Crashlytics स्टैक अनइंडिंग नामक प्रक्रिया का उपयोग करके वर्तमान थ्रेड के कॉल स्टैक को कैप्चर करता है। यह प्रक्रिया CPU और I/O गहन हो सकती है, विशेष रूप से आर्किटेक्चर पर जो DWARF अनइंडिंग (arm64 और x86) का समर्थन करते हैं। खोलना पूरा होने के बाद, जानकारी को डिस्क पर सिंक्रोनस रूप से लिखा जाता है। यह डेटा हानि को रोकता है यदि अगली पंक्ति क्रैश हो जाती है।

हालांकि इस एपीआई को बैकग्राउंड थ्रेड पर कॉल करना सुरक्षित है, याद रखें कि इस कॉल को दूसरी कतार में भेजने से वर्तमान स्टैक ट्रेस का संदर्भ खो जाता है।

NSExceptions के बारे में क्या?

Crashlytics प्रवेश करने और रिकॉर्डिंग के लिए एक सुविधा प्रदान नहीं करता है NSException सीधे उदाहरणों। सामान्यतया, कोको और कोको टच एपीआई अपवाद-सुरक्षित नहीं हैं। मतलब यह है कि के उपयोग @catch यहाँ तक कि जब अत्यधिक सावधानी से इस्तेमाल किया अपनी प्रक्रिया में बहुत गंभीर अनायास ही दुष्प्रभाव हो सकते हैं। आप का उपयोग कभी नहीं करना चाहिए @catch अपने कोड में बयान। देखें एप्पल के प्रलेखन विषय पर।

स्टैक ट्रेस को अनुकूलित करें

यदि आपका ऐप गैर-देशी वातावरण (जैसे C++ या यूनिटी) में चलता है, तो आप अपने ऐप के मूल अपवाद प्रारूप में क्रैश मेटाडेटा की रिपोर्ट करने के लिए अपवाद मॉडल API का उपयोग कर सकते हैं। रिपोर्ट किए गए अपवादों को गैर-घातक के रूप में चिह्नित किया गया है।

तीव्र

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)

उद्देश्य सी

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];

कस्टम स्टैक फ़्रेम को केवल पतों के साथ प्रारंभ किया जा सकता है:

तीव्र

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)

उद्देश्य सी

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];

ऑप्ट-इन रिपोर्टिंग सक्षम करें

डिफ़ॉल्ट रूप से, Crashlytics स्वचालित रूप से आपके सभी ऐप के उपयोगकर्ताओं के लिए क्रैश रिपोर्ट एकत्र करता है। उपयोगकर्ताओं को उनके द्वारा भेजे जाने वाले डेटा पर अधिक नियंत्रण देने के लिए, आप स्वचालित रिपोर्टिंग को अक्षम करके और केवल Crashlytics को डेटा भेजकर ऑप्ट-इन रिपोर्टिंग सक्षम कर सकते हैं, जब आप अपने कोड में चुनते हैं:

  1. आपके लिए एक नया कुंजी जोड़कर स्वत: संग्रह को बंद कर दें Info.plist फ़ाइल:

    • कुंजी: FirebaseCrashlyticsCollectionEnabled
    • मान: false
  2. Crashlytics डेटा संग्रह ओवरराइड को रनटाइम पर कॉल करके चुनिंदा उपयोगकर्ताओं के लिए संग्रह सक्षम करें। ओवरराइड मान आपके ऐप्लिकेशन के सभी लॉन्च पर बना रहता है, इसलिए Crashlytics स्वचालित रूप से रिपोर्ट एकत्र कर सकता है।

    स्वत: क्रैश रिपोर्टिंग से बाहर निकलना करने के लिए, पारित false ओवरराइड मान के रूप में। करने के लिए सेट करते हैं false , नया मान एप्लिकेशन के अगले रन तक लागू नहीं होता।

    तीव्र

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    उद्देश्य सी

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

क्रैश इनसाइट डेटा प्रबंधित करें

Crash Insights आपके अनाम स्टैक ट्रेस की तुलना अन्य Firebase ऐप्स के ट्रैस से करके और आपको यह बताकर समस्याओं को हल करने में मदद करता है कि क्या आपकी समस्या किसी बड़े चलन का हिस्सा है। कई मुद्दों के लिए, क्रैश इनसाइट्स आपको क्रैश को डीबग करने में मदद करने के लिए संसाधन भी प्रदान करता है।

क्रैश इनसाइट्स सामान्य स्थिरता रुझानों की पहचान करने के लिए एकत्रित क्रैश डेटा का उपयोग करता है। आप अपने ऐप के डेटा साझा नहीं करना चाहते हैं तो आप अपनी Crashlytics मुद्दा सूची के शीर्ष पर क्रैश इनसाइट्स मेनू से क्रैश इनसाइट्स के बाहर निकल सकते हैं Firebase कंसोल