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 तरीके का इस्तेमाल करके, एक साथ कई की/वैल्यू पेयर जोड़ें. इसके लिए, एक ही पैरामीटर के तौर पर NSDictionary का इस्तेमाल करें:

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)")

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

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

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

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

Crashlytics, NSException के इंस्टेंस को सीधे लॉग करने और रिकॉर्ड करने की सुविधा नहीं देता. आम तौर पर, Cocoa और Cocoa Touch API, अपवाद के हिसाब से सुरक्षित नहीं होते. इसका मतलब है कि @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];

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

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