Firebase Crashlytics की क्रैश रिपोर्ट को पसंद के मुताबिक बनाएं

Crashlytics के डैशबोर्ड में, किसी समस्या पर क्लिक करके, इवेंट की ज़्यादा जानकारी वाली रिपोर्ट देखी जा सकती है. इन रिपोर्ट को पसंद के मुताबिक बनाया जा सकता है. इनसे आपको यह समझने में मदद मिलती है कि आपके ऐप्लिकेशन में क्या हो रहा है. साथ ही, Crashlytics को रिपोर्ट किए गए इवेंट की स्थितियों के बारे में भी जानकारी मिलती है.

  • अगर आपका ऐप्लिकेशन Google Analytics के लिए Firebase SDK टूल का इस्तेमाल करता है, तो आपको अपने-आप ब्रेडक्रंब लॉग मिलेंगे. इन लॉग से, आपको उपयोगकर्ता की उन कार्रवाइयों की जानकारी मिलती है जो आपके ऐप्लिकेशन में Crashlytics से इकट्ठा किए गए इवेंट के बाद की जाती हैं.

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

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

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

  • Crashlytics के डैशबोर्ड में, कस्टम पासकोड से मैच होने वाली समस्याएं खोजी जा सकती हैं.
  • कंसोल में किसी खास समस्या की समीक्षा करते समय, हर इवेंट से जुड़ी कस्टम कुंजियां (कुंजी सबटैब) देखी जा सकती हैं. साथ ही, इवेंट को कस्टम कुंजियों (पेज के सबसे ऊपर मौजूद फ़िल्टर मेन्यू) के हिसाब से फ़िल्टर भी किया जा सकता है.

कुंजी/वैल्यू पेयर को सेट करने के लिए, setCustomValue तरीके का इस्तेमाल करें. उदाहरण के लिए:

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

पूर्णांक, बूलियन या फ़्लोट सेट करते समय, वैल्यू को @(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"];

आपके पास किसी कुंजी को कॉल करने और उसे किसी दूसरी वैल्यू पर सेट करने का भी विकल्प है. उदाहरण के लिए:

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

कुंजी/वैल्यू का जोड़ा एक साथ जोड़ने के लिए, setCustomKeysAndValues तरीके का इस्तेमाल करें. ऐसा करने के लिए, NS अनुमान को सिर्फ़ एक पैरामीटर के तौर पर इस्तेमाल करें:

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

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

क्रैश होने के बाद होने वाले इवेंट के बारे में ज़्यादा जानकारी देने के लिए, अपने ऐप्लिकेशन में Crashlytics के कस्टम लॉग जोड़ें. Crashlytics, लॉग को आपके क्रैश डेटा से जोड़ता है. साथ ही, लॉग टैब में, Firebase कंसोल के Crashlytics पेज पर इन लॉग को दिखाता है.

Swift

समस्याओं का पता लगाने के लिए, log() या log(format:, arguments:) का इस्तेमाल करें. अगर आपको मैसेज के साथ एक अच्छा लॉग आउटपुट चाहिए, तो log() को पास किया जाने वाला ऑब्जेक्ट CustomStringConvertible प्रॉपर्टी के मुताबिक होना चाहिए. log() वह जानकारी दिखाता है जिसे आपने ऑब्जेक्ट के लिए तय किया है. उदाहरण के लिए:

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

getVaList() को कॉल करने पर .log(format:, arguments:) फ़ॉर्मैट की वैल्यू मिलीं. उदाहरण के लिए:

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

log() या log(format:, arguments:) को इस्तेमाल करने के तरीके के बारे में ज़्यादा जानने के लिए, Crashlytics का रेफ़रंस दस्तावेज़ पढ़ें.

Objective-C

समस्याओं का पता लगाने के लिए, 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 का इस्तेमाल करके, ऐप्लिकेशन की क्रैश रिपोर्ट में उपयोगकर्ताओं की पहचान छिपाकर उनकी पहचान की जा सकती है.

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

Swift

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

Objective-C

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

अगर आपको सेट करने के बाद उपयोगकर्ता आइडेंटिफ़ायर को हटाने की ज़रूरत पड़ती है, तो वैल्यू को खाली स्ट्रिंग पर रीसेट करें. किसी उपयोगकर्ता आइडेंटिफ़ायर को मिटाने से मौजूदा Crashlytics रिकॉर्ड नहीं हटते. अगर आपको किसी यूज़र आईडी से जुड़े रिकॉर्ड मिटाने हैं, तो Firebase की सहायता टीम से संपर्क करें.

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

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

recordError तरीके का इस्तेमाल करके, NSError ऑब्जेक्ट रिकॉर्ड करके, नुकसान न पहुंचाने वाले अपवाद रिकॉर्ड किए जा सकते हैं. recordError, [NSThread callStackReturnAddresses] को कॉल करके थ्रेड के कॉल स्टैक को कैप्चर करता है.

Swift

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

Objective-C

[[FIRCrashlytics crashlytics] recordError:error];

recordError तरीके का इस्तेमाल करते समय, NSError के स्ट्रक्चर को समझना ज़रूरी है. साथ ही, यह समझना भी ज़रूरी है कि Crashlytics, डेटा का इस्तेमाल क्रैश को ग्रुप करने के लिए कैसे करता है. recordError तरीके का गलत इस्तेमाल करने से, हो सकता है कि आपको कुछ न पता हो. इससे Crashlytics, आपके ऐप्लिकेशन में लॉग की गई गड़बड़ियों की रिपोर्टिंग को सीमित कर सकता है.

किसी NSError ऑब्जेक्ट में तीन आर्ग्युमेंट होते हैं:

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

नुकसान पहुंचाने वाली गड़बड़ियों को स्टैक ट्रेस के विश्लेषण की मदद से ग्रुप किया जाता है, जबकि लॉग की गई गड़बड़ियों को domain और code के हिसाब से ग्रुप में रखा जाता है. यह गंभीर क्रैश और लॉग की गई गड़बड़ियों के बीच एक अहम फ़र्क़ है. उदाहरण के लिए:

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

ऊपर बताई गई गड़बड़ी को लॉग करने पर, एक नई समस्या बनती है. इसे NSSomeErrorDomain और -1001 के हिसाब से ग्रुप में बांटा जाता है. एक ही डोमेन और कोड वैल्यू का इस्तेमाल करने वाली, लॉग की गई अन्य गड़बड़ियों को एक ही समस्या के तहत ग्रुप किया जाता है. userInfo ऑब्जेक्ट में मौजूद डेटा को की-वैल्यू पेयर में बदल दिया जाता है. साथ ही, इसे किसी समस्या के 'की'/लॉग सेक्शन में दिखाया जाता है.

लॉग और कस्टम बटन

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

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

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

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

NSअपवादों के बारे में क्या?

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

स्टैक ट्रेस को पसंद के मुताबिक बनाएं

अगर आपका ऐप्लिकेशन किसी गैर-नेटिव एनवायरमेंट (जैसे, C++ या Unity) में चलता है, तो क्रैश मेटाडेटा की रिपोर्ट करने के लिए अपवाद मॉडल एपीआई का इस्तेमाल किया जा सकता है. उसे अपने ऐप्लिकेशन के अपवाद वाले नेटिव फ़ॉर्मैट में रिपोर्ट किया जा सकता है. रिपोर्ट किए गए अपवादों को नुकसान न पहुंचाने वाले के तौर पर मार्क किया गया है.

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

कस्टम स्टैक फ़्रेम को सिर्फ़ पतों से भी शुरू किया जा सकता है:

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

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

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

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

Analytics SDK टूल, screen_view इवेंट को अपने-आप लॉग करता है. इसकी मदद से, ब्रेडक्रंब लॉग क्रैश, नुकसान न पहुंचाने वाली या ANR वाली स्क्रीन की सूची को दिखाने के लिए चालू हो जाता है. screen_view ब्रेडक्रंब लॉग में, firebase_screen_class पैरामीटर होता है.

ब्रेडक्रंब लॉग में ऐसे सभी कस्टम इवेंट अपने-आप भर जाते हैं जिन्हें आपने उपयोगकर्ता के सेशन में मैन्युअल तरीके से लॉग किया है. इसमें इवेंट के पैरामीटर का डेटा भी शामिल है. इस डेटा से, उपयोगकर्ता की उन कार्रवाइयों की सीरीज़ दिखाने में मदद मिल सकती है जिनकी वजह से क्रैश, नुकसान न पहुंचाने वाली या ANR इवेंट होती हैं.

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

ऑप्ट-इन रिपोर्टिंग चालू करें

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

  1. अपनी Info.plist फ़ाइल में नई कुंजी जोड़कर, डेटा अपने-आप इकट्ठा होने की सुविधा बंद करें:

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

    ऐप्लिकेशन बंद होने की अपने-आप रिपोर्ट होने की सुविधा से ऑप्ट आउट करने के लिए, false को ओवरराइड वैल्यू के तौर पर पास करें. false पर सेट करने पर, नई वैल्यू तब तक लागू नहीं होती, जब तक ऐप्लिकेशन को अगली बार नहीं चलाया जाता.

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

क्रैश की अहम जानकारी का डेटा मैनेज करें

क्रैश इनसाइट की मदद से, समस्याओं को हल किया जा सकता है. इसके लिए, पहचान छिपाने वाले स्टैक ट्रेस की तुलना, Firebase के अन्य ऐप्लिकेशन के ट्रेस से की जाती है. साथ ही, यह भी बताया जाता है कि क्या आपकी समस्या किसी बड़े ट्रेंड का हिस्सा है. कई समस्याओं के लिए, क्रैश इनसाइट, क्रैश को डीबग करने में मदद करने वाले संसाधन भी उपलब्ध कराती है.

क्रैश इनसाइट में, ऐप्लिकेशन क्रैश होने से जुड़े इकट्ठा किए गए डेटा का इस्तेमाल किया जाता है, ताकि स्थिरता से जुड़े सामान्य रुझानों का पता लगाया जा सके. अगर आपको अपने ऐप्लिकेशन का डेटा शेयर नहीं करना है, तो Firebase कंसोल में, Crashlytics से जुड़ी समस्या की सूची में सबसे ऊपर मौजूद क्रैश की अहम जानकारी वाले मेन्यू में जाकर, क्रैश की अहम जानकारी से ऑप्ट-आउट किया जा सकता है.