Прочитавши всі ці відповіді тут, щоб символізувати журнал аварій (і, нарешті, досягти успіху), я думаю, що тут відсутні деякі моменти, які є дійсно важливими для того, щоб визначити, чому виклик символічної аварії не дає символічного виводу.
Є три об’єкти, які повинні поєднуватися разом, коли символізують журнал аварій:
- Сам файл журналу збоїв (тобто
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 з UUID aa5e633efda8346cab92b01320043dc3.
Ви можете перевірити UUID двійкового пакету, який ви маєте з dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Після цього слід перевірити, чи належать символи налагодження до цього двійкового файлу:
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
Примітка: Символізований зворотний шлях буде виведений на термінал, а не symbolicate.log.
symbolicatecrashкоманду, як її використовувати та як знайти файл dSYM, необхідний для символізації.