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
.app
package (c'est-à-dire example.app
) qui contient lui-même le binaire d'application appartenant au journal des plantages. Si vous avez un .ipa
package (ie example.ipa
), vous pouvez extraire le .app
package en décompressant le .ipa
package (ie unzip example.ipa
). Ensuite, le .app
paquet réside dans le fichier extraitPayload/
dossier .
- Le
.dSYM
paquet 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 symbolicatecrash
script:
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 symbolicatecrash
dans 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 .dSYM
packages avec un UUID spécifique. Si Spotlight ne trouve pas votre .dSYM
colis, il symbolicatecrash
ne 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 symbolicatecrash
trouve votre .dSYM
colis, 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 .app
package, 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 symbolicatecrash
trouve votre .app
paquet, 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, symbolicatecrash
il 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
.
symbolicatecrash
commande, comment l'utiliser et comment trouver le fichier dSYM nécessaire pour effectuer la symbolisation.