หลังจากอ่านคำตอบทั้งหมดเหล่านี้ที่นี่เพื่อเป็นสัญลักษณ์บันทึกข้อผิดพลาด (และประสบความสำเร็จในที่สุด) ฉันคิดว่ามีบางจุดที่หายไปที่นี่ซึ่งมีความสำคัญจริง ๆ เพื่อกำหนดว่าทำไมการภาวนาของ
มีสินทรัพย์ 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 กับ aa5e633efda8346cab92b01320043dc3UUID
คุณสามารถตรวจสอบ 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 ที่จำเป็นในการทำสัญลักษณ์