Dopo aver letto tutte queste risposte qui al fine di simboleggiare un registro degli arresti anomali (e alla fine riuscito), penso che manchino alcuni punti che sono davvero importanti per determinare perché l'invocazione di Symbolicatecrash non produce un output simbolizzato.
Ci sono 3 risorse che devono adattarsi insieme quando simbolizza un registro degli arresti anomali:
- Il file di registro degli arresti anomali stesso (ovvero
example.crash
), esportato dall'organizzatore XCode o ricevuto da iTunes Connect.
- Il
.app
pacchetto (ovvero example.app
) che contiene esso stesso il file binario dell'app appartenente al registro degli arresti anomali. Se si dispone di un .ipa
pacchetto (ovvero example.ipa
), è possibile estrarre il .app
pacchetto decomprimendo il .ipa
pacchetto (ovvero unzip example.ipa
). Successivamente il .app
pacchetto risiede nella Payload/
cartella estratta .
- Il
.dSYM
pacchetto contenente i simboli di debug (ovvero example.app.dSYM
)
Prima di iniziare la simbolizzazione, dovresti controllare se tutti questi artefatti corrispondono, il che significa che il registro degli arresti anomali appartiene al binario che hai e che i simboli di debug sono quelli prodotti durante la compilazione di quel binario.
Ogni binario è indicato da un UUID che può essere visto nel file di registro degli arresti anomali:
...
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
...
In questo estratto il registro degli arresti anomali appartiene a un'immagine binaria dell'app denominata esempio.app/esempio con UUID aa5e633efda8346cab92b01320043dc3
.
Puoi controllare l'UUID del pacchetto binario che hai con dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Successivamente dovresti controllare se i simboli di debug che hai appartengono anche a quel binario:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
In questo esempio tutte le risorse si incastrano e dovresti essere in grado di simboleggiare la tua stack stack.
Procedendo alla symbolicatecrash
sceneggiatura:
In Xcode 8.3 dovresti essere in grado di invocare lo script tramite
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Se non è presente, è possibile eseguire un find . -name symbolicatecrash
nella directory Xcode.app per trovarlo.
Come puoi vedere non ci sono più parametri forniti. Quindi lo script deve trovare i simboli binari e di debug dell'applicazione eseguendo una ricerca Spotlight. Cerca i simboli di debug con un indice specifico chiamato com_apple_xcode_dsym_uuids
. Puoi fare questa ricerca da solo:
mdfind 'com_apple_xcode_dsym_uuids = *'
resp.
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
La prima chiamata Spotlight ti dà tutti i pacchetti indicizzati dSYM e la seconda ti dà i .dSYM
pacchetti con un UUID specifico. Se Spotlight non trova il tuo .dSYM
pacchetto symbolicatecrash
, non lo sarà nemmeno. Se fai tutte queste cose, ad esempio in una sottocartella dei tuoi ~/Desktop
riflettori, dovresti riuscire a trovare tutto.
Se symbolicatecrash
trova il tuo .dSYM
pacchetto, dovrebbe esserci una riga come la seguente in symbolicate.log
:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Per trovare il tuo .app
pacchetto viene invocata una ricerca spotlight come la seguente symbolicatecrash
:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Se symbolicatecrash
trova il tuo .app
pacchetto, dovrebbe esserci il seguente estratto in symbolicate.log
:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Se tutte queste risorse vengono trovate da symbolicatecrash
esso dovrebbe stampare la versione simbolizzata del registro degli arresti anomali.
Altrimenti puoi trasferire direttamente i tuoi file dSYM e .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
Nota: il backtrace simbolizzato verrà inviato al terminale, no symbolicate.log
.
symbolicatecrash
comando, come usarlo e come trovare il file dSYM necessario per eseguire la simbolizzazione.