Прочитавши всі ці відповіді тут, щоб символізувати журнал аварій (і, нарешті, досягти успіху), я думаю, що тут відсутні деякі моменти, які є дійсно важливими для того, щоб визначити, чому виклик символічної аварії не дає символічного виводу.
Є три об’єкти, які повинні поєднуватися разом, коли символізують журнал аварій:
- Сам файл журналу збоїв (тобто
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, необхідний для символізації.