ในหน้าแดชบอร์ด Crashlytics คุณสามารถคลิกปัญหาเพื่อดูรายงานเหตุการณ์โดยละเอียด คุณสามารถปรับแต่งรายงานดังกล่าวเพื่อช่วยให้คุณเข้าใจสิ่งที่เกิดขึ้นในแอปและสถานการณ์รอบเหตุการณ์ที่รายงานไปยัง Crashlytics ได้ดีขึ้น
เครื่องมือวัดผลแอปเพื่อบันทึกคีย์ที่กำหนดเอง ข้อความบันทึกที่กำหนดเอง และตัวระบุผู้ใช้
รายงานข้อยกเว้นไปยัง Crashlytics
รับบันทึกเบรดครัมบ์โดยอัตโนมัติหากแอปใช้ Firebase SDK สําหรับ Google Analytics บันทึกเหล่านี้ช่วยให้คุณเห็นการกระทําของผู้ใช้ที่นําไปสู่เหตุการณ์ที่รวบรวมโดย 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 จะเชื่อมโยงบันทึกกับข้อมูลข้อขัดข้องและแสดงในหน้า Crashlytics ของคอนโซล Firebase ในส่วนแท็บบันทึก
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 ยังให้คุณบันทึกข้อยกเว้นที่ไม่ร้ายแรงและส่งให้คุณเมื่อแอปเปิดขึ้นครั้งถัดไป
คุณสามารถบันทึกข้อยกเว้นที่ไม่ร้ายแรงได้โดยการบันทึกออบเจ็กต์ NSError
ด้วยเมธอด
recordError
recordError
จะบันทึกกองซ้อนการเรียกของชุดข้อความโดยเรียกใช้
[NSThread callStackReturnAddresses]
Swift
Crashlytics.crashlytics().record(error: error)
Objective-C
[[FIRCrashlytics crashlytics] recordError:error];
เมื่อใช้วิธีการ recordError
คุณจะต้องเข้าใจโครงสร้าง NSError
และวิธีที่ Crashlytics ใช้ข้อมูลเพื่อจัดกลุ่มข้อขัดข้อง การใช้เมธอด recordError
อย่างไม่ถูกต้องอาจทําให้แอปทำงานในลักษณะที่ไม่คาดคิดและอาจทําให้ Crashlytics จํากัดการรายงานข้อผิดพลาดที่บันทึกไว้สําหรับแอป
ออบเจ็กต์ NSError
มีอาร์กิวเมนต์ 3 รายการ ดังนี้
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 จะบันทึกกองซ้อนการเรียกของชุดข้อความปัจจุบันโดยใช้กระบวนการที่เรียกว่าการเลิกซ้อนกอง กระบวนการนี้อาจใช้ CPU และ I/O มาก โดยเฉพาะอย่างยิ่งในสถาปัตยกรรมที่รองรับการเลิกใช้ DWARF (arm64 และ x86)
หลังจากเลิกทำเรียบร้อยแล้ว ระบบจะเขียนข้อมูลลงดิสก์แบบซิงค์
วิธีนี้จะช่วยป้องกันไม่ให้ข้อมูลสูญหายหากบรรทัดถัดไปขัดข้อง
แม้ว่าการเรียก API นี้ในเธรดแบ็กกราวด์จะปลอดภัย แต่โปรดทราบว่าการส่งการเรียกนี้ไปยังคิวอื่นจะทำให้เสียบริบทของสแต็กเทรซปัจจุบัน
แล้ว 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];
ดูบันทึกเบรดครัมบ์
บันทึกเบรดครัมบ์ช่วยให้คุณเข้าใจการโต้ตอบของผู้ใช้กับแอปที่ทําให้เกิดเหตุการณ์ข้อขัดข้อง เหตุการณ์ที่ไม่ใช่ข้อขัดข้องร้ายแรง หรือ ANR ได้ดียิ่งขึ้น บันทึกเหล่านี้อาจมีประโยชน์เมื่อพยายามจำลองและแก้ไขข้อบกพร่องของปัญหา
บันทึกเบรดครัมบ์มาจาก Google Analytics ดังนั้นหากต้องการดูบันทึกเบรดครัมบ์ คุณจะต้องเปิดใช้ Google Analytics สําหรับโปรเจ็กต์ Firebase และเพิ่ม Firebase SDK สําหรับ Google Analytics ลงในแอป เมื่อมีคุณสมบัติตรงตามข้อกําหนดเหล่านี้แล้ว บันทึกเบรดครัมบ์จะรวมอยู่ในข้อมูลของเหตุการณ์ในแท็บบันทึกโดยอัตโนมัติเมื่อคุณดูรายละเอียดของปัญหา
Analytics SDK จะบันทึกเหตุการณ์ screen_view
โดยอัตโนมัติ ซึ่งช่วยให้บันทึกเบรดครัมบ์แสดงรายการหน้าจอที่ดูก่อนเกิดเหตุการณ์ข้อขัดข้องร้ายแรง เหตุการณ์ข้อขัดข้องที่ไม่ร้ายแรง หรือ ANR บันทึกเบรดครัมบ์ screen_view
มีพารามิเตอร์ firebase_screen_class
บันทึกเบรดครัมบ์จะสร้างขึ้นจากเหตุการณ์ที่กําหนดเองที่คุณบันทึกด้วยตนเองภายในเซสชันของผู้ใช้ รวมถึงข้อมูลพารามิเตอร์ของเหตุการณ์ ข้อมูลนี้ช่วยแสดงชุดการดำเนินการของผู้ใช้ที่นำไปสู่ข้อขัดข้อง เหตุการณ์ที่ไม่ร้ายแรง หรือ ANR
โปรดทราบว่าคุณสามารถควบคุมการเก็บรวบรวมและการใช้ข้อมูล Google Analytics ซึ่งรวมถึงข้อมูลที่แสดงในบันทึกเบรดครัมบ์
เปิดใช้การรายงานการเลือกใช้
โดยค่าเริ่มต้น Crashlytics จะรวบรวมรายงานข้อขัดข้องสำหรับผู้ใช้แอปทุกคนโดยอัตโนมัติ หากต้องการให้ผู้ใช้ควบคุมข้อมูลที่ส่งได้มากขึ้น คุณสามารถเปิดใช้การรายงานแบบเลือกใช้ได้โดยปิดใช้การรายงานอัตโนมัติและส่งข้อมูลไปยัง Crashlytics เฉพาะเมื่อคุณเลือกในโค้ดเท่านั้น
ปิดการเก็บรวบรวมอัตโนมัติโดยเพิ่มคีย์ใหม่ลงในไฟล์
Info.plist
- แป้น:
FirebaseCrashlyticsCollectionEnabled
- ค่า:
false
- แป้น:
เปิดใช้การเก็บรวบรวมสําหรับผู้ใช้บางรายโดยการเรียกใช้การลบล้างCrashlyticsการเก็บรวบรวมข้อมูลขณะรันไทม์ ค่าการลบล้างจะยังคงอยู่ตลอดการเปิดตัวแอปเพื่อให้ Crashlytics รวบรวมรายงานโดยอัตโนมัติได้
หากต้องการเลือกไม่ใช้การรายงานข้อขัดข้องอัตโนมัติ ให้ส่ง
false
เป็นค่าการลบล้าง เมื่อตั้งค่าเป็นfalse
ระบบจะไม่ใช้ค่าใหม่จนกว่าแอปจะทำงานครั้งถัดไปSwift
Crashlytics.crashlytics().setCrashlyticsCollectionEnabled(true)
Objective-C
[[FIRCrashlytics crashlytics] setCrashlyticsCollectionEnabled:YES];
จัดการข้อมูลเชิงลึกเกี่ยวกับข้อขัดข้อง
ข้อมูลเชิงลึกเกี่ยวกับข้อขัดข้องจะช่วยคุณแก้ปัญหาโดยการเปรียบเทียบสแต็กเทรซที่ลบข้อมูลระบุตัวบุคคลแล้วกับเทรซจากแอป Firebase อื่นๆ และแจ้งให้คุณทราบว่าปัญหาของคุณเป็นส่วนหนึ่งของแนวโน้มที่ใหญ่ขึ้นหรือไม่ สําหรับปัญหาหลายอย่าง ข้อมูลวิเคราะห์ข้อขัดข้องยังมีแหล่งข้อมูลเพื่อช่วยแก้ไขข้อขัดข้องด้วย
ข้อมูลเชิงลึกเกี่ยวกับข้อขัดข้องใช้ข้อมูลข้อขัดข้องที่รวบรวมไว้เพื่อระบุแนวโน้มความเสถียรที่พบได้ทั่วไป หากไม่ต้องการแชร์ข้อมูลของแอป คุณสามารถเลือกไม่ใช้ข้อมูลเชิงลึกข้อขัดข้องจากเมนูข้อมูลเชิงลึกข้อขัดข้องที่ด้านบนของรายการปัญหา Crashlytics ในคอนโซล Firebase