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