अपनी फायरबेस क्रैशलाइटिक्स क्रैश रिपोर्ट को अनुकूलित करें

क्रैशलिटिक्स डैशबोर्ड में, आप किसी समस्या पर क्लिक कर सकते हैं और विस्तृत ईवेंट रिपोर्ट प्राप्त कर सकते हैं। आपके ऐप में क्या हो रहा है और क्रैशलिटिक्स को रिपोर्ट की गई घटनाओं के आसपास की परिस्थितियों को बेहतर ढंग से समझने में मदद के लिए आप उन रिपोर्टों को कस्टमाइज़ कर सकते हैं।

  • यदि आपका ऐप Google Analytics के लिए फायरबेस एसडीके का उपयोग करता है तो स्वचालित रूप से ब्रेडक्रंब लॉग प्राप्त करें। ये लॉग आपको आपके ऐप में क्रैशलाईटिक्स-एकत्रित ईवेंट तक ले जाने वाली उपयोगकर्ता गतिविधियों की दृश्यता प्रदान करते हैं।

  • स्वचालित क्रैश रिपोर्टिंग बंद करें और अपने उपयोगकर्ताओं के लिए ऑप्ट-इन रिपोर्टिंग सक्षम करें । ध्यान दें कि, डिफ़ॉल्ट रूप से, 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];

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

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

तीव्र

समस्याओं का पता लगाने में सहायता के लिए 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:) उपयोग करने के तरीके के बारे में अधिक जानकारी के लिए, क्रैशलाईटिक्स संदर्भ दस्तावेज़ देखें।

उद्देश्य सी

समस्याओं का पता लगाने में सहायता के लिए 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().setUserID("123456789")

उद्देश्य सी

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

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

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

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

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

तीव्र

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

उद्देश्य सी

[[FIRCrashlytics crashlytics] recordError:error];

recordError विधि का उपयोग करते समय, NSError संरचना को समझना महत्वपूर्ण है और क्रैशलाईटिक्स समूह क्रैश के लिए डेटा का उपयोग कैसे करता है। 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 में संदर्भ जोड़ने के लिए लॉग और कस्टम कुंजियाँ एम्बेड कर सकते हैं। हालाँकि, क्रैश से जुड़े लॉग बनाम लॉग त्रुटियों में अंतर है। जब कोई क्रैश होता है और ऐप को दोबारा लॉन्च किया जाता है, तो क्रैशलाइटिक्स डिस्क से जो लॉग पुनर्प्राप्त करता है, वे वही होते हैं जो क्रैश के समय तक लिखे गए थे। जब आप NSError लॉग करते हैं, तो ऐप तुरंत समाप्त नहीं होता है। क्योंकि क्रैशलाईटिक्स केवल अगले ऐप लॉन्च पर लॉग त्रुटि रिपोर्ट भेजता है और डिस्क पर लॉग के लिए आवंटित स्थान की मात्रा को सीमित करना चाहिए, NSError रिकॉर्ड होने के बाद पर्याप्त लॉग करना संभव है ताकि क्रैशलाईटिक्स के समय तक सभी प्रासंगिक लॉग घुमाए जा सकें। डिवाइस से रिपोर्ट. NSErrors लॉग करते समय और अपने ऐप में लॉग और कस्टम कुंजियों का उपयोग करते समय इस संतुलन को ध्यान में रखें।

प्रदर्शन संबंधी विचार

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

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

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

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

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

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

तीव्र

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

ब्रेडक्रंब लॉग प्राप्त करें

ब्रेडक्रंब लॉग आपको उन इंटरैक्शन की बेहतर समझ देते हैं जो किसी उपयोगकर्ता ने आपके ऐप के साथ क्रैश, गैर-घातक, या एएनआर घटना के कारण किए थे। किसी समस्या को पुन: उत्पन्न करने और डीबग करने का प्रयास करते समय ये लॉग सहायक हो सकते हैं।

ब्रेडक्रंब लॉग Google Analytics द्वारा संचालित होते हैं, इसलिए ब्रेडक्रंब लॉग प्राप्त करने के लिए, आपको अपने फ़ायरबेस प्रोजेक्ट के लिए Google Analytics को सक्षम करना होगा और अपने ऐप में Google Analytics के लिए फ़ायरबेस SDK जोड़ना होगा । एक बार जब ये आवश्यकताएं पूरी हो जाती हैं, तो जब आप किसी समस्या का विवरण देखते हैं तो ब्रेडक्रंब लॉग स्वचालित रूप से लॉग टैब के भीतर इवेंट के डेटा के साथ शामिल हो जाते हैं।

एनालिटिक्स एसडीके स्वचालित रूप से screen_view इवेंट को लॉग करता है जो ब्रेडक्रंब लॉग को क्रैश, गैर-घातक या एएनआर इवेंट से पहले देखी गई स्क्रीन की सूची दिखाने में सक्षम बनाता है। screen_view ब्रेडक्रंब लॉग में एक firebase_screen_class पैरामीटर होता है।

ब्रेडक्रंब लॉग किसी भी कस्टम ईवेंट से भी भरे जाते हैं जिन्हें आप उपयोगकर्ता के सत्र में मैन्युअल रूप से लॉग करते हैं, जिसमें ईवेंट का पैरामीटर डेटा भी शामिल होता है। यह डेटा क्रैश, गैर-घातक, या ANR ईवेंट तक ले जाने वाली उपयोगकर्ता गतिविधियों की एक श्रृंखला दिखाने में मदद कर सकता है।

ध्यान दें कि आप Google Analytics डेटा के संग्रह और उपयोग को नियंत्रित कर सकते हैं, जिसमें ब्रेडक्रंब लॉग को पॉप्युलेट करने वाला डेटा शामिल है।

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

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

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

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

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

    तीव्र

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    उद्देश्य सी

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

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

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

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