Firebase is back at Google I/O on May 10! Register now

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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.

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

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

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

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

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

तीव्र

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 कंसोल के Crashlytics पृष्ठ में, Logs टैब के अंतर्गत प्रदर्शित करता है।

तीव्र

समस्याओं को इंगित करने में सहायता के लिए 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 विधि का गलत उपयोग अप्रत्याशित व्यवहार का कारण बन सकता है और क्रैशलिटिक्स को आपके ऐप के लिए लॉग की गई त्रुटियों की रिपोर्टिंग को सीमित करने का कारण बन सकता है।

एक 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 अनवाइंडिंग (आर्म64 और x86) का समर्थन करते हैं। खोलना पूरा होने के बाद, जानकारी डिस्क पर सिंक्रोनस रूप से लिखी जाती है। यदि अगली पंक्ति क्रैश होती है तो यह डेटा हानि को रोकता है।

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

एनएसईएक्सप्शन के बारे में क्या?

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

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

यदि आपका ऐप गैर-देशी वातावरण (जैसे 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];

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

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

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