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() वह जानकारी दिखाता है जो आपने ऑब्जेक्ट के लिए तय की है. उदाहरण के लिए:

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

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

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 API के लिए अपवाद सुरक्षित नहीं है. इसका मतलब है कि @catch को इस्तेमाल करने से, आपकी प्रोसेस पर अनचाहे असर पड़ सकते हैं. ऐसा बहुत सावधानी से करने पर भी होता है. आपको अपने कोड में कभी भी @catch स्टेटमेंट का इस्तेमाल नहीं करना चाहिए. इस विषय से जुड़े Apple के दस्तावेज़ पढ़ें.

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

अगर आपका ऐप्लिकेशन किसी ऐसी जगह (जैसे कि C++ या Unity) में चलता है, तो अपने ऐप्लिकेशन के नेटिव अपवाद फ़ॉर्मैट में क्रैश मेटाडेटा को रिपोर्ट करने के लिए, अपवाद 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];

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

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

ब्रेडक्रंब लॉग 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 से जुड़ी समस्याओं की सूची के सबसे ऊपर मौजूद क्रैश की अहम जानकारी मेन्यू में जाकर, क्रैश की अहम जानकारी से ऑप्ट-आउट किया जा सकता है.