หลังจากอ่านคำตอบทั้งหมดเหล่านี้ที่นี่เพื่อเป็นสัญลักษณ์บันทึกข้อผิดพลาด (และประสบความสำเร็จในที่สุด) ฉันคิดว่ามีบางจุดที่หายไปที่นี่ซึ่งมีความสำคัญจริง ๆ เพื่อกำหนดว่าทำไมการภาวนาของ
มีสินทรัพย์ 3 รายการที่ต้องสอดคล้องกันเมื่อเป็นสัญลักษณ์ของบันทึกข้อผิดพลาด:
- ไฟล์บันทึกข้อขัดข้องนั้นเอง (เช่น
example.crash
) ส่งออกจากออแกไนเซอร์ของ XCode หรือได้รับจาก iTunes Connect
.app
แพคเกจ (คือexample.app
) ที่ตัวเองมีไบนารีแอปที่อยู่ในบันทึกของความผิดพลาด หากคุณมี.ipa
แพ็คเกจ (เช่นexample.ipa
) คุณสามารถแตก.app
ไฟล์ได้โดยการคลายซิป.ipa
แพ็กเกจ (เช่นunzip example.ipa
) หลังจากนั้น.app
แพ็คเกจจะอยู่ในPayload/
โฟลเดอร์ที่แยกออกมา
.dSYM
แพคเกจที่มีสัญลักษณ์การแก้ปัญหา (เช่นexample.app.dSYM
)
ก่อนที่จะเริ่มเป็นสัญลักษณ์คุณควรตรวจสอบว่าสิ่งประดิษฐ์ทั้งหมดนั้นตรงกันหรือไม่ซึ่งหมายความว่าบันทึกการทำงานผิดพลาดนั้นเป็นของไบนารีที่คุณมีและสัญลักษณ์ดีบักนั้นเป็นสิ่งที่สร้างขึ้นระหว่างการสร้างไบนารีนั้น
แต่ละไบนารีถูกอ้างอิงโดย UUID ที่สามารถเห็นได้ในไฟล์บันทึกข้อผิดพลาด:
...
Binary Images:
0xe1000 - 0x1f0fff +example armv7 <aa5e633efda8346cab92b01320043dc3> /var/mobile/Applications/9FB5D11F-42C0-42CA-A336-4B99FF97708F/example.app/example
0x2febf000 - 0x2fedffff dyld armv7s <4047d926f58e36b98da92ab7a93a8aaf> /usr/lib/dyld
...
ในสารสกัดจากนี้บันทึกความผิดพลาดเป็นภาพแอปไบนารีชื่อ example.app/example กับ aa5e633efda8346cab92b01320043dc3
UUID
คุณสามารถตรวจสอบ UUID ของแพ็คเกจไบนารีที่คุณมีกับ dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
หลังจากนั้นคุณควรตรวจสอบว่าสัญลักษณ์ debug ที่คุณเป็นของไบนารีนั้นหรือไม่:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
ในตัวอย่างนี้สินทรัพย์ทั้งหมดเข้าด้วยกันและคุณควรจะสามารถเป็นสัญลักษณ์สแต็คของคุณ
ดำเนินการกับsymbolicatecrash
สคริปต์:
ใน Xcode 8.3 คุณควรจะสามารถเรียกใช้สคริปต์ผ่านทาง
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
หากไม่มีคุณสามารถเรียกใช้find . -name symbolicatecrash
ในไดเรกทอรี Xcode.app ของคุณเพื่อค้นหา
อย่างที่คุณเห็นไม่มีการกำหนดพารามิเตอร์อีกแล้ว ดังนั้นสคริปต์ต้องค้นหาสัญลักษณ์ไบนารีและดีบักแอปพลิเคชันของคุณโดยใช้การค้นหาที่น่าสนใจ com_apple_xcode_dsym_uuids
มันค้นหาสัญลักษณ์การแก้ปัญหาที่มีค่าดัชนีเฉพาะที่เรียกว่า คุณสามารถค้นหาได้ด้วยตนเอง:
mdfind 'com_apple_xcode_dsym_uuids = *'
รับผิดชอบ
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
การเรียกใช้สปอตไลท์ครั้งแรกจะให้แพ็คเกจ dSYM ที่มีการทำดัชนีทั้งหมดของคุณและอันที่สองให้.dSYM
แพ็กเกจที่มี UUID เฉพาะ หากสปอตไลท์ไม่พบ.dSYM
แพ็คเกจของคุณก็symbolicatecrash
จะไม่เป็นเช่นนั้น หากคุณทำสิ่งนี้ทั้งหมดเช่นในโฟลเดอร์ย่อยของคุณ~/Desktop
สปอตไลท์ควรจะสามารถค้นหาทุกสิ่งได้
หากsymbolicatecrash
พบ.dSYM
แพ็คเกจของคุณควรมีบรรทัดดังต่อไปนี้ในsymbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
สำหรับการค้นหา.app
แพ็คเกจของคุณการค้นหาสปอตไลท์เช่นนี้จะถูกเรียกใช้โดยsymbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
หากsymbolicatecrash
พบ.app
แพ็คเกจของคุณควรมีสารสกัดดังต่อไปนี้ในsymbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
หากพบทรัพยากรเหล่านั้นทั้งหมดsymbolicatecrash
ควรพิมพ์บันทึกข้อมูลความผิดพลาดที่เป็นสัญลักษณ์รุ่น
หากไม่ใช่คุณสามารถส่งผ่านไฟล์ dSYM และ. app ได้โดยตรง
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
หมายเหตุ:ติดตามย้อนหลัง symbolicated symbolicate.log
จะถูกส่งออกไปยังสถานีไม่
symbolicatecrash
คำสั่งวิธีใช้งานและวิธีค้นหาไฟล์ dSYM ที่จำเป็นในการทำสัญลักษณ์