Прочитав все эти ответы здесь для того, чтобы символизировать журнал сбоев (и, наконец, успешно), я думаю, что здесь не хватает некоторых моментов, которые действительно важны для определения того, почему вызов symbolicatecrash не производит символьный вывод.
Есть 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 с 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"
Первый вызов Spotlight дает вам все проиндексированные пакеты 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, необходимый для символизации.