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

सिर्फ़ एक पैरामीटर के तौर पर NSDictionary के साथ setCustomKeysAndValues तरीके का इस्तेमाल करके, एक साथ कई की/वैल्यू पेयर जोड़ें:

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(), ऑब्जेक्ट के लिए तय की गई description प्रॉपर्टी दिखाता है. उदाहरण के लिए:

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 रेफ़रंस दस्तावेज़ देखें.

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 आपके ऐप्लिकेशन के क्रैश होने की जानकारी अपने-आप भेजता है. साथ ही, यह आपको ऐसे अपवादों को रिकॉर्ड करने की सुविधा देता है जिनसे ऐप्लिकेशन क्रैश नहीं होता. इसके बाद, यह उन्हें आपके पास भेजता है. ऐसा तब होता है, जब आपका ऐप्लिकेशन अगली बार लॉन्च होता है.

NSError ऑब्जेक्ट को recordError तरीके से रिकॉर्ड करके, नॉन-फ़ैटल अपवादों को रिकॉर्ड किया जा सकता है. 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) के साथ काम करते हैं. अनवाइंडिंग पूरी होने के बाद, जानकारी को डिस्क पर सिंक्रोनस तरीके से लिखा जाता है. इससे अगली लाइन के क्रैश होने पर डेटा का नुकसान नहीं होता.

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

NSExceptions के बारे में क्या जानकारी है?

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

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

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

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 इवेंट को अपने-आप लॉग करता है. इससे ब्रेडक्रंब लॉग, क्रैश, नॉन-फ़ैटल या एएनआर इवेंट से पहले देखी गई स्क्रीन की सूची दिखा पाते हैं. screen_view ब्रेडक्रंब लॉग में firebase_screen_class पैरामीटर शामिल होता है.

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

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

ऑप्ट-इन रिपोर्टिंग की सुविधा चालू करना

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

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

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

    Swift

    Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)

    Objective-C

    [[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];

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

क्रैश इनसाइट के डेटा को मैनेज करना

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

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