Depois de ler todas essas respostas aqui para simbolizar um log de falha (e finalmente ter êxito), acho que há alguns pontos ausentes aqui que são realmente importantes para determinar por que a chamada do symbolicatecrash não produz uma saída simbolizada.
Existem três ativos que precisam ser ajustados ao simbolizar um log de falha:
- O próprio arquivo de log de falha (ou seja,
example.crash
), exportado do organizador do XCode ou recebido do iTunes Connect.
- O
.app
pacote (por exemplo example.app
) que contém o binário do aplicativo pertencente ao log de falha. Se você possui um .ipa
pacote (ie example.ipa
), pode extraí-lo .app
descompactando o .ipa
pacote (ie unzip example.ipa
). Posteriormente, o .app
pacote reside no extraídoPayload/
pasta .
- O
.dSYM
pacote que contém os símbolos de depuração (ie example.app.dSYM
)
Antes de iniciar a simbolização, você deve verificar se todos esses artefatos correspondem, o que significa que o log de falha pertence ao binário que você possui e que os símbolos de depuração são os produzidos durante a construção desse binário.
Cada binário é referido por um UUID que pode ser visto no arquivo de log de falha:
...
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
...
Nesta extração, o log de falha pertence a uma imagem binária do aplicativo chamada exemplo.app/example com UUID aa5e633efda8346cab92b01320043dc3
.
Você pode verificar o UUID do pacote binário que você possui com o dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Depois, você deve verificar se os símbolos de depuração que você também pertencem a esse binário:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
Neste exemplo, todos os ativos se encaixam e você deve poder simbolizar seu rastreamento de pilha.
Prosseguindo para o symbolicatecrash
script:
No Xcode 8.3, você poderá chamar o script via
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Se não estiver lá, você pode executar um find . -name symbolicatecrash
no diretório Xcode.app para encontrá-lo.
Como você pode ver, não há mais parâmetros dados. Portanto, o script precisa encontrar os símbolos binários e de depuração do aplicativo executando uma pesquisa de destaque. Ele pesquisa os símbolos de depuração com um índice específico chamado com_apple_xcode_dsym_uuids
. Você pode fazer essa pesquisa você mesmo:
mdfind 'com_apple_xcode_dsym_uuids = *'
resp.
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
A primeira chamada de destaque fornece todos os pacotes dSYM indexados e a segunda fornece os .dSYM
pacotes com um UUID específico. Se os holofotes não encontrarem o seu .dSYM
pacote, symbolicatecrash
eles também não encontrarão . Se você fizer tudo isso, por exemplo, em uma subpasta do seu ~/Desktop
holofote, você poderá encontrar tudo.
Se symbolicatecrash
encontrar o seu .dSYM
pacote, deve haver uma linha como a seguinte em symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Para encontrar seu .app
pacote, uma pesquisa de destaque como a seguinte é invocada por symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Se symbolicatecrash
encontrar o seu .app
pacote, deve haver o seguinte extrato em symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Se todos esses recursos forem encontrados symbolicatecrash
, deve imprimir a versão simbolizada do seu log de falhas.
Caso contrário, você pode passar seus arquivos dSYM e .app diretamente.
symbolicatecrash -v --dsym <SOME_PATH>/<App_URI>.app.dSYM/<APP_NAME>.app.dsym <CRASHFILE> <SOME_OTHER_PATH>/<APP_NAME>.app/<APP_NAME> > symbolicate.log
Nota: O backtrace simbolizado será enviado para o terminal, não symbolicate.log
.
symbolicatecrash
Listo onde encontrar o comando, como usá-lo e como encontrar o arquivo dSYM necessário para realizar a simbolização.