dSYM คืออะไรและใช้อย่างไร? (iOS SDK)


118

บางครั้งคอมไพเลอร์สร้างไฟล์. dSYM ฉันเดาว่านี่เป็นไฟล์ที่เกี่ยวข้องกับการดีบัก แต่ฉันไม่รู้ว่ามันคืออะไรและจะใช้อย่างไร

.dSYM คืออะไร? ฉันจะใช้มันได้อย่างไร?

คำตอบ:


160

ไฟล์ dSYM จัดเก็บสัญลักษณ์การดีบักสำหรับแอปของคุณ

บริการต่างๆเช่น crashlytics ใช้เพื่อแทนที่สัญลักษณ์ในบันทึกข้อขัดข้องด้วยชื่อวิธีการที่เหมาะสมเพื่อให้อ่านได้และเหมาะสม

ประโยชน์ของการใช้ dSYM คือคุณไม่จำเป็นต้องจัดส่งแอปของคุณด้วยสัญลักษณ์ทำให้ยากต่อการทำวิศวกรรมย้อนกลับและยังลดขนาดไบนารีของคุณ

ในการใช้เพื่อเป็นสัญลักษณ์ของบันทึกข้อขัดข้องคุณต้องลากบันทึกข้อขัดข้องลงในบันทึกอุปกรณ์ของอุปกรณ์ในตัวจัดระเบียบของเครื่องที่รวบรวมไบนารีของแอป (เครื่องที่เก็บ dSYM)

หากคุณมี dSYM แต่ไม่มีเครื่องแอปไบนารีที่คอมไพล์แล้วให้ทำตามคำแนะนำในลิงค์นี้เพื่อติดตั้ง dSYM ลงในเครื่อง

สำหรับข้อมูลเพิ่มเติมโปรดดูหมายเหตุทางเทคนิคของ apple TN2151


1
การไม่รวม dSYM กับไบนารีของ app store ทำให้ Crashlytics ไม่สามารถบันทึกข้อขัดข้องได้หรือไม่
genaks

ดังนั้นจึงปลอดภัยที่จะยกเลิกการเลือกช่อง "รวมสัญลักษณ์แอป ... "?
genaks

2
หากคุณต้องการดู crashlogs ใน apple connect คุณสามารถใส่สัญลักษณ์ของแอพได้เมื่อคุณอัปโหลดแอพไปที่ app store หากคุณใช้ crashlytics คุณไม่จำเป็นต้องทำ แต่ไม่เจ็บที่จะรวมสัญลักษณ์ของแอพ (ไฟล์ dsym) แล้วส่งไปที่ apple โดยทำเครื่องหมายที่ "รวมสัญลักษณ์แอพ ... " ในการอัปโหลดไปยังแอพ ตัวช่วยสร้างร้านค้า
Tomer Even

1
ฉันคิดว่าจะช่วยชีวิตผู้ใช้สองสาม MB หากสามารถทำได้
genaks

จากนักพัฒนา Crashlytics - twittercommunity.com/t/…
genaks

2

dSYMย่อมาจาก Xcode Debugging Symbols เป็นไฟล์การแมปชนิดหนึ่งซึ่งสามารถถอดรหัส stack-trace ให้อยู่ในรูปแบบที่อ่านได้ เป็นBundleโครงสร้างถัดไป:

ตัวอย่างเช่นบันทึกข้อขัดข้องมีลักษณะดังนี้:

//before
0   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 217984
1   libswiftCore.dylib              0x000000018f3c9380 0x18f394000 + 217984
2   libswiftCore.dylib              0x000000018f3c8844 0x18f394000 + 215108
3   libswiftCore.dylib              0x000000018f3a74e0 0x18f394000 + 79072
4   libswiftCore.dylib              0x000000018f3ab0d8 0x18f394000 + 94424
5   F49088168M                      0x00000001045ac750 0x104590000 + 116560
6   F49088168M                      0x00000001045b7904 0x104590000 + 162052
7   F49088168M                      0x00000001045b897c 0x104590000 + 166268
8   F49088168M                      0x000000010459d914 0x104590000 + 55572
9   F49088168M                      0x00000001045a0e70 0x104590000 + 69232
10  F49088168M                      0x00000001045a0f4c 0x104590000 + 69452

dSYM ในการดำเนินการ

//after Symbolicating(dSYM is used)
0   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 452
1   libswiftCore.dylib              0x000000018f3c9380 closure #1 in closure #1 in closure #1 in _assertionFailure+ 217984 (_:_:file:line:flags:) + 452
2   libswiftCore.dylib              0x000000018f3c8844 _assertionFailure+ 215108 (_:_:file:line:flags:) + 468
3   libswiftCore.dylib              0x000000018f3a74e0 _ArrayBuffer._checkInoutAndNativeTypeCheckedBounds+ 79072 (_:wasNativeTypeChecked:) + 208
4   libswiftCore.dylib              0x000000018f3ab0d8 Array.subscript.getter + 84
5   F49088168M                      0x00000001045ac750 static ELM327ResponseManager.getResponse(responseStr:obd2Protocol:) + 116560 (ELM327ResponseManager.swift:27)
6   F49088168M                      0x00000001045b7904 ELM327Client.dataInput(_:characteristicUuidStr:) + 162052 (ELM327Client.swift:56)
7   F49088168M                      0x00000001045b897c protocol witness for BLEClientInputPort.dataInput(_:characteristicUuidStr:) in conformance ELM327Client + 166268 (<compiler-generated>:0)
8   F49088168M                      0x000000010459d914 BLEConnection.peripheralDataReceived(data:characteristicUuidStr:) + 55572 (BLEConnection.swift:124)
9   F49088168M                      0x00000001045a0e70 BLEConnection.peripheral(_:didUpdateValueFor:error:) + 69232 (BLEConnection.swift:293)
10  F49088168M                      0x00000001045a0f4c @objc BLEConnection.peripheral(_:didUpdateValueFor:error:) + 69452 (<compiler-generated>:0)

โดยค่าเริ่มต้นdSYMจะถูกสร้างขึ้นโดยค่าเริ่มต้นสำหรับเวอร์ชันที่วางจำหน่าย คุณสามารถตรวจสอบได้:

Build Settings -> Generate Debug Symbols -> Yes
Build Settings -> Debug Information Format -> DWARF with dSYM File

ตำแหน่งผลลัพธ์ที่คุณสามารถค้นหาได้ Productsโฟลเดอร์

ในการสร้างdSYMไฟล์ด้วยตนเองจากการ.appใช้dsymutil

dsymutil F49088168M.app/F49088168M -o F49088168M.app.dSYM

เพื่อเป็นสัญลักษณ์ของความผิดพลาดโดยใช้ symbolicatecrash

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/Current/Resources/symbolicatecrash "<path>/F49088168M-2020-06-04-212904.crash" "<path>/F49088168M.app.dSYM" > symbolicated.crash

เพื่อเปิดdSYMด้วยตนเองโดยใช้dwarfdump

dwarfdump --arch arm64 --debug-pubtypes F49088168M.app.dSYM

ผลลัพธ์ดูเหมือนว่า:

0x00000065 "PeripheralLogView"
0x000005cc "BLEConnection"
0x000005da "BLEPeripheral"
0x000005e9 "ELM327Client"

[คำศัพท์]


คำตอบที่ละเอียดและมีประโยชน์ ขอบคุณ.
thedp
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.