Après avoir lu toutes ces réponses ici afin de symboliser un journal de plantage (et finalement réussi), je pense qu'il manque quelques points ici qui sont vraiment importants pour déterminer pourquoi l'invocation de symbolicatecrash ne produit pas une sortie symbolisée.
Il y a 3 actifs qui doivent s'imbriquer lors de la symbolisation d'un journal des pannes:
- Le fichier journal des plantages lui-même (c'est-à-dire
example.crash ), soit exporté de l'organisateur de XCode, soit reçu d'iTunes Connect.
- Le
.apppackage (c'est-à-dire example.app) qui contient lui-même le binaire d'application appartenant au journal des plantages. Si vous avez un .ipapackage (ie example.ipa), vous pouvez extraire le .apppackage en décompressant le .ipapackage (ie unzip example.ipa). Ensuite, le .apppaquet réside dans le fichier extraitPayload/ dossier .
- Le
.dSYMpaquet contenant les symboles de débogage (ie example.app.dSYM)
Avant de commencer la symbolisation, vous devez vérifier si tous ces artefacts correspondent, ce qui signifie que le journal des plantages appartient au binaire que vous avez et que les symboles de débogage sont ceux produits lors de la génération de ce binaire.
Chaque binaire est référencé par un UUID qui peut être vu dans le fichier journal des plantages:
...
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
...
Dans cet extrait, le journal des plantages appartient à une image binaire d'application nommée example.app/example avec UUID aa5e633efda8346cab92b01320043dc3 .
Vous pouvez vérifier l'UUID du package binaire que vous avez avec dwarfdump:
dwarfdump --uuid example.app/example
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app/example
Ensuite, vous devriez vérifier si les symboles de débogage que vous avez appartiennent également à ce binaire:
dwarfdump --uuid example.app.dSYM
UUID: AA5E633E-FDA8-346C-AB92-B01320043DC3 (armv7) example.app.dSYM/Contents/Resources/DWARF/example
Dans cet exemple, tous les actifs s'assemblent et vous devriez pouvoir symboliser votre stacktrace.
Procéder au symbolicatecrashscript:
Dans Xcode 8.3, vous devriez pouvoir invoquer le script via
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
S'il n'est pas là, vous pouvez exécuter un find . -name symbolicatecrashdans votre répertoire Xcode.app pour le trouver.
Comme vous pouvez le voir, il n'y a plus de paramètres donnés. Le script doit donc trouver les symboles binaires et de débogage de votre application en exécutant une recherche Spotlight. Il recherche les symboles de débogage avec un index spécifique appelé com_apple_xcode_dsym_uuids. Vous pouvez faire cette recherche vous-même:
mdfind 'com_apple_xcode_dsym_uuids = *'
resp.
mdfind "com_apple_xcode_dsym_uuids == AA5E633E-FDA8-346C-AB92-B01320043DC3"
La première invocation Spotlight vous donne tous les packages dSYM indexés et la seconde vous donne les .dSYMpackages avec un UUID spécifique. Si Spotlight ne trouve pas votre .dSYMcolis, il symbolicatecrashne le fera pas non plus. Si vous faites tout cela par exemple dans un sous-dossier de votre~/Desktop projecteur, devriez pouvoir tout trouver.
Si symbolicatecrashtrouve votre .dSYMcolis, il devrait y avoir une ligne comme celle-ci dans symbolicate.log:
@dsym_paths = ( <SOME_PATH>/example.app.dSYM/Contents/Resources/DWARF/example )
Pour trouver votre .apppackage, une recherche Spotlight comme celle-ci est invoquée par symbolicatecrash:
mdfind "kMDItemContentType == com.apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Si symbolicatecrashtrouve votre .apppaquet, il devrait y avoir l'extrait suivant dans symbolicate.log:
Number of symbols in <SOME_PATH>/example.app/example: 2209 + 19675 = 21884
Found executable <SOME_PATH>/example.app/example
-- MATCH
Si toutes ces ressources sont trouvées, symbolicatecrashil devrait imprimer la version symbolisée de votre journal des plantages.
Sinon, vous pouvez directement transmettre vos fichiers dSYM et .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
Remarque: La trace symbolisée sera sortie vers le terminal, non symbolicate.log.
symbolicatecrashcommande, comment l'utiliser et comment trouver le fichier dSYM nécessaire pour effectuer la symbolisation.