Comment symboliser le journal de crash Xcode?

190

L'organisateur Xcode 5 avait une vue qui listait tous les journaux de crash. et nous pourrions faire glisser les journaux de crash ici. Mais depuis Xcode 6, je sais qu'ils ont déplacé les appareils de l'organisation et ont une nouvelle fenêtre pour le même. Mais je ne trouve pas d'endroit où je vois les journaux de crash que j'ai glissé-déposés dans Xcode 5 après être passé à Xcode 6. Quelqu'un connaît la réponse?

Nithin Pai
la source
3
J'ai posé la question il y a des mois sur les forums des développeurs Apple et je n'ai jamais obtenu de réponse. C'est une perte de fonctionnalité utile. Déposez un rapport de bogue avec Apple en demandant de récupérer cette fonctionnalité.
rmaddy
1
J'ai mis cela ensemble pendant un week-end pour résoudre la symbolisation des vidages sur incident iOS et OSX. C'est encore très difficile, mais ça devrait marcher. github.com/agentsim/Symbolicator
Tim
4
Xcode, pouvez-vous s'il vous plaît simplement f --- ing symboliser les journaux de crash des critiques Apple comme vous êtes censé le faire ... plutôt que de supposer que nous avons littéralement toute la journée pour comprendre comment faire cela?
William Entriken

Réponses:

120

Ok, j'ai réalisé que vous pouvez faire ceci:

  1. Dans Xcode > Window > Devices , sélectionnez un iPhone / iPad / etc connecté en haut à gauche.
  2. Afficher les journaux de périphérique
  3. Tous les journaux

Vous avez probablement beaucoup de journaux là-bas, et pour faciliter la recherche de votre journal importé plus tard, vous pouvez simplement continuer et supprimer tous les journaux à ce stade ... à moins qu'ils ne vous rapportent de l'argent. Ou à moins que vous ne connaissiez le moment exact où le crash s'est produit - il devrait être écrit dans le fichier de toute façon ... Je suis paresseux donc je supprime simplement tous les anciens journaux (cela a en fait pris un certain temps).

  1. Faites simplement glisser et déposez votre fichier dans cette liste. Cela a fonctionné pour moi.
Jonny
la source
13
J'ai le même problème, mais cela ne résout pas le problème pour moi - les journaux que je glisse et dépose dans la fenêtre apparaissent, mais ne symbolisent pas.
Arkaaito
9
L'astuce est que vous devez connecter un appareil et sélectionner l'appareil dans la liste. Je ne pense pas que ce soit possible sans appareil.
Jonny
61
Pour que votre fichier de panne puisse être déplacé dans cette liste, il doit avoir l'extension .crash.
pjay_
7
L'étape manquante pour moi était une fois que le fichier a été déposé, je devais cliquer avec le bouton droit de la souris sur le fichier et Re-Symbolicate Log
RobCroll
6
N'oubliez pas de "Télécharger les dSYM" pour cette archive dans l'Organisateur.
123FLO321
259

Ecrire cette réponse autant pour la communauté que pour moi.

S'il y a des problèmes symbolisant un rapport de plantage, on peut les surmonter comme suit:

  1. Créez un dossier séparé, copiez Foo.appet Foo.app.dSYMdu correspondant .xcarchivedans le dossier. Copiez également le .crashrapport dans le dossier.

  2. Ouvrez le rapport de plantage dans TextEdit ou ailleurs, allez dans la Binary Images:section, et copiez-y la première adresse (par exemple 0xd7000).

  3. cddans le dossier. Vous pouvez maintenant exécuter la commande suivante:

    xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 0x0033f9bb

Cela symbolisera le symbole à l'adresse 0x0033f9bb. Veuillez vous assurer de choisir la valeur correcte pour l' -archoption (peut être obtenue à partir de la première ligne de la Binary Images:section, ou comprise dans leHardware Model: dans le rapport de plantage et les arches prises en charge par l'application).

Vous pouvez également copier les adresses nécessaires (par exemple une pile d'appels de thread) du rapport de plantage directement dans un fichier texte (dans TextEdit, maintenez Option et sélectionnez le bloc de texte nécessaire, ou copiez et coupez), pour obtenir quelque chose comme ceci:

0x000f12fb
0x002726b7
0x0026d415
0x001f933b
0x001f86d3

Vous pouvez maintenant l'enregistrer dans un fichier texte, par exemple addr.txt, et exécuter la commande suivante:

xcrun atos -o Foo.app/Foo -arch arm64 -l 0xd7000 -f addr.txt

Cela donnera une belle symbolique pour toutes les adresses à la fois.

PS

Avant de faire ce qui précède, il vaut la peine de vérifier que tout est correctement configuré (comme atosle signalera volontiers quelque chose pour pratiquement toute adresse fournie).

Pour effectuer la vérification, ouvrez le rapport d’incident et accédez à la fin de la pile d’appels pour Thread 0. La première ligne à partir de la fin pour lister votre application (généralement la deuxième), par exemple:

34  Foo                    0x0033f9bb 0xd7000 + 2525627

devrait être l' main()appel. La symbolisation de l'adresse ( 0x0033f9bbdans ce cas) comme décrit ci-dessus devrait confirmer qu'il s'agit bienmain() et non d'une méthode ou d'une fonction aléatoire.

Si l'adresse n'est pas celle de main(), vérifiez votre adresse de chargement ( -loption) et votre arc (-arch option).

PPS

Si ce qui précède ne fonctionne pas à cause du bitcode , téléchargez le dSYM pour votre build à partir d'iTunes Connect, extrayez le binaire exécutable du dSYM (Finder> Show Package Contents), copiez-le dans le répertoire et utilisez-le (c'est-à-dire Foo) comme le argument à atos, au lieu du Foo.app/Foo.

Côte maritime du Tibet
la source
2
merci pour la peine d'écrire le tutoriel mini xcrun et de le mettre à jour avec la section de vérification de l'intégrité. ma santé mentale est sauvée après beaucoup de jurons et aucun symbole en vue
Anton Tropashko
10
N'oubliez pas de valider que le rapport de plantage correspond à l'exécutable et à dSYM. Vous pouvez vérifier cela en faisant correspondre l'identifiant dans les <> sous la section Image binaire avec celui renvoyé par votre fichier exécutable en exécutantxcrun dwarfdump --uuid <path to executable>
Ryan C. Payne
2
Il est important de noter que seuls les symboles de votre application (Foo) apparaîtront. Il n'apparaîtra pas pour les symboles de bibliothèques / frameworks externes, tels que Foundation ou libsystem_kernel.dylib.
jlukanta
1
cela est utile, mais ne fonctionne toujours pas pour moi. la partie avec laquelle j'ai des problèmes est que je n'ai pas les informations 0xd7000. ma ligne ressemble à ceci 0x100038328 __mh_execute_header + 99112. J'ai lu ce qu'est __mh_execute_header mais comment puis-je obtenir des informations sur 0x100038328 ??? j'ai tout le reste
skinsfan00atg
5
J'ai écrit un script bash simple qui fait l'essentiel du travail pour vous. Utilisation: ./symbolicate.sh mycrash.crash MyApp.app arch64 output.crash seulement, il symbolisera le rapport de panne complet et vous en donnera la version symbolisée. gist.github.com/nathan-fiscaletti/…
Nathan F.
187

Vous pouvez également vous référer à celui-ci, j'ai écrit la procédure étape par étape de la re-symbolisation manuelle du crash.

Re-symbolisation du crash

ÉTAPE 1

Déplacez tous les fichiers ci-dessus (MyApp.app, MyApp-dSYM.dSYM et MyApp-Crash-log.crash) dans un dossier avec un nom pratique partout où vous pouvez aller en utilisant facilement Terminal.

Pour moi, Desktop est l'endroit le plus facilement accessible;) J'ai donc déplacé ces trois fichiers dans un dossier MyApp sur Desktop.

ÉTAPE 2

Maintenant c'est au tour du Finder, accédez au chemin suivant celui qui s'applique à votre version XCODE.

Utilisez cette commande pour trouver le symbolicatecrashfichier de script,
find /Applications/Xcode.app -name symbolicatecrash

Xcode 8, Xcode 9, Xcode 11 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

Xcode 7.3 /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash

XCode 7 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources/symbolicatecrash

Xcode 6 /Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Plus bas que Xcode 6 Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKitBase.framework/Versions/A/Resources

Ou Contents/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources

ÉTAPE 3

Ajoutez le répertoire du fichier script symbolicatecrash trouvé à la $PATHvariable env comme ceci: sudo vim /etc/paths.d/Xcode-symbolicatecrashet collez le répertoire du fichier script et enregistrez le fichier. Lors de l'ouverture d'un nouveau terminal, vous pouvez appeler symbolicatecrashn'importe quel dossier en tant que commandes situées dans /usr/bin.

Ou

Copiez le fichier symbolicatecrash à partir de cet emplacement et collez-le sur le bureau / MyApp (Attendez… Ne me suivez pas aveuglément, je colle le fichier sybolicatecrash dans le dossier MyApp, celui que vous avez créé à la première étape à votre emplacement préféré, contenant trois fichiers. )

ÉTAPE 4

Ouvrez Terminal et CD dans le dossier MyApp.

cd Desktop/MyApp — Press Enter
export DEVELOPER_DIR=$(xcode-select --print-path)

 -  Appuyez sur Entrée

./symbolicatecrash -v MyApp-Crash-log.crash MyApp.dSYM

 -  Appuyez sur Entrée

C'est tout !! Les logs symbolisés sont sur votre terminal… maintenant qu'attendez-vous? Maintenant, trouvez simplement l'erreur et résolvez-la;)

Bon codage !!!

Mrug
la source
2
@ EmilVikström: Merci pour la suggestion, ont mis à jour la réponse.
Mrug
2
Utilisez export DEVELOPER_DIR =xcode-select --print-path
Parag Bafna
8
A travaillé un régal - merci. Juste une chose que je devais utiliser export DEVELOPER_DIR = / Applications / XCode.app / Contents / Developer (sans les guillemets).
goelectric
1
"export DEVELOPER_DIR = xcode-select --print-path" me dit juste "-bash: export:` --print-path ': pas un identifiant valide
Almo
2
mettre à jour; C'est ici ; pour xcode7, trouvez symbolicatecrash ici; /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash /Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versecions/A/Resatources/symbolic stackover.com / 32804611 /…
AnneTheAgile
28

Pour moi, le fichier .crash était suffisant. Sans fichier .dSYM et fichier .app.

J'ai exécuté ces deux commandes sur le mac où je construis l'archive et cela a fonctionné:

export DEVELOPER_DIR="/Applications/Xcode.app/Contents/Developer" 

/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash  /yourPath/crash1.crash > /yourPath/crash1_symbolicated.crash
Marek Manduch
la source
sensationnel. Je ne sais pas comment cela fonctionne sans le fichier .dsym mais cela fonctionne!
rustyMagnet
4
@rustyMagnet La façon dont cela fonctionne est d'utiliser des dsyms des builds archivés sur votre ordinateur.
Andrey Tarantsov
1
Oui, cela ne fonctionne que pour les builds que vous avez archivés avec Xcode, pas pour les autres builds que vous avez peut-être générés pour des exécutions ad hoc pour lesquelles vous souhaitez ensuite symboliser les journaux de crash.
CMash
21

Il existe un moyen plus simple d'utiliser Xcode (sans utiliser les outils de ligne de commande et rechercher les adresses une à la fois)

  1. Prenez n'importe quel fichier .xcarchive. Si vous en avez un avant, vous pouvez l'utiliser. Si vous n'en avez pas, créez-en un en exécutant le Produit> Archiver à partir de Xcode.

  2. Cliquez avec le bouton droit sur le fichier .xcarchive et sélectionnez `` Afficher le contenu du paquet ''

  3. Copiez le fichier dsym (de la version de l'application qui a planté) dans le dossier dSYMs

  4. Copiez le fichier .app (de la version de l'application qui a planté) dans le dossier Produits> Applications

  5. Modifiez le fichier Info.plist et modifiez CFBundleShortVersionString et CFBundleVersion dans le dictionnaire ApplicationProperties. Cela vous aidera à identifier l'archive plus tard

  6. Double-cliquez sur l'archive .x pour l'importer dans Xcode. Il devrait ouvrir l'Organisateur.

  7. Revenez au journal des pannes (dans la fenêtre Appareils dans Xcode)

  8. Faites-y glisser votre fichier .crash (s'il n'est pas déjà présent)

  9. L'ensemble du journal des pannes doit maintenant être symbolisé. Sinon, cliquez avec le bouton droit de la souris et sélectionnez 'Re-symbolicate crash log'

RPM
la source
1
Votre réponse est correcte et simple. Il n'est pas nécessaire d'utiliser l'application Terminal. La recréation du dossier .xcarchive est très importante, car il n'y a pas de fichier .xcarchive dans certains systèmes d'intégration continue, au lieu de la balle zip du dossier .app.dSYM. Par coïncidence, ce que j'ai fait hier est exactement le même que vous avez dit.
DawnSong
à quoi devrait ressembler la sortie complète?
noobsmcgoobs
Cela symbolise en partie mes journaux de plantage bien que j'aie sauté l'étape 3 à 5 car mon xcarchive est pour la version de l'application qui s'est plantée.
Declan McKenna
1
Il ne symbolisera que votre propre code bien sûr - pas le code de bibliothèque externe que vous avez peut-être utilisé.
RPM
7

Suivez ces étapes dans Xcode 10 pour symboliser un journal des pannes à partir d'une application construite sur la même machine:

  1. Organisateur intérieur , recherchez l'archive sur laquelle l'application est basée.
  2. Cliquez sur les symboles de débogage de téléchargement bouton . Rien n'apparaîtra dans votre dossier Téléchargements, mais c'est OK.
  3. Connectez la machine de construction à un appareil iOS.
  4. Sélectionnez l'appareil dans Appareils et simulateurs .
  5. Cliquez sur Afficher les journaux des appareils bouton .
  6. Faites glisser et déposez le fichier de plantage dans le panneau de gauche. Le fichier doit se terminer par un .crash extension , sinon le glissement échoue.
  7. Passer au onglet Tous les journaux .
  8. Sélectionnez le fichier de plantage ajouté.
  9. Le fichier doit automatiquement symboliser, sinon utilisez l'élément de menu contextuel contextuel Re-Symbolicate Log .
Ely
la source
1
Au début, je ne pensais pas que cela ajoutait quoi que ce soit à d'autres articles, mais les deux premières étapes, en particulier les «Télécharger les symboles de débogage», semblent être ce qui me manquait. Je vous remercie.
Christopher King
6

Si vous avez le .dSYM et le fichier .crash dans le même sous-dossier, voici les étapes que vous pouvez suivre:

  1. En regardant la trace dans le fichier .crash, notez le nom de l'image binaire dans la deuxième colonne, et l'adresse dans la troisième colonne (par exemple 0x00000001000effdc dans l'exemple ci-dessous).
  2. Juste sous la trace arrière, dans la section "Images binaires", notez le nom de l'image, l'architecture (par exemple arm64) et l'adresse de chargement (0x1000e4000 dans l'exemple ci-dessous) de l'image binaire (par exemple TheElements).
  3. Exécutez les opérations suivantes:

$ atos -arch arm64 -o TheElements.app.dSYM/Contents/Resources/DWARF/TheElements -l 0x1000e4000 0x00000001000effdc -[AtomicElementViewController myTransitionDidStop:finished:context:]

Source faisant autorité: https://developer.apple.com/library/content/technotes/tn2151/_index.html#//apple_ref/doc/uid/DTS40008184-CH1-SYMBOLICATE_WITH_ATOS

Victor Bogdan
la source
4

Xcode 11.2.1, décembre 2019

Apple vous donne le journal des plantages au format .txt, qui n'est pas symbolisé

**

Avec l'appareil connecté

**

  • Téléchargez le fichier ".txt", changez l'extension en ".crash" entrez la description de l'image ici
    • Ouvrez les appareils et les simulateurs à partir de l'onglet de la fenêtre dans Xcode
    • sélectionnez l'appareil et sélectionnez les journaux de l'appareil
    • glisser-déposer le fichier .crash dans la fenêtre du journal de l'appareil

entrez la description de l'image ici

Nous pourrons voir les journaux de crash symbolisés là-bas

Veuillez consulter le lien pour plus de détails sur la symbolisation des journaux de crash

Suraj K Thomas
la source
Sensationnel. Changer l'extension de fichier de .txt à .crash l'a fait. Ils m'ont donné un fichier .txt. Merci mec. Je n'arrive pas à croire que votre réponse soit aussi basse.
datWooWoo
3

Assurez-vous que le nom de votre application Xcode ne contient aucun espace. C'était la raison pour laquelle cela n'a pas fonctionné pour moi. Donc ça /Applications/Xcode.appmarche, alors que /Applications/Xcode 6.1.1.appça ne marche pas.

Bouke
la source
As-tu essayé? Sinon, essayez de voir si votre commentaire a du sens.
Bouke
1
Ce n'est pas le même problème dont je parle. Xcode peut être renommé après l'installation, mais avant la première utilisation. Cependant, le script de symbolisation ne peut pas gérer les espaces dans le nom de l'application et échouera.
Bouke
1
@ChuckKrutsinger Avez-vous réellement essayé? Parce que les espaces échappés vous permettront d'exécuter le script, mais le script lui-même échouera. Le script n'appelle probablement pas d'autres scripts avec l'espace d'échappement.
Bouke
1
@ChuckKrutsinger C'est très bien et tout, mais si l'on veut que Xcode symbolise automatiquement le journal des plantages, vous aurez besoin de ma réponse à la fin.
Bouke
1
Je tiens à réitérer que bouke est correct et que si vous avez un espace dans le chemin de l'application Xcode, le script que Xcode utilise pour symboliser à nouveau les journaux de crash ne fonctionnera PAS. Rien à voir avec la re-symbolisation manuelle.
Gary Makin
2

À partir de la documentation d'Apple:

Symbolique des rapports de plantage avec Xcode Xcode tentera automatiquement de symboliser tous les rapports de plantage qu'il rencontre. Tout ce que vous avez à faire pour la symbolisation est d'ajouter le rapport de plantage à Xcode Organizer.

  • Connectez un appareil iOS à votre Mac
  • Choisissez "Appareils" dans le menu "Fenêtre"
  • Dans la section "APPAREILS" de la colonne de gauche, choisissez un appareil
  • Cliquez sur le bouton "Afficher les journaux de périphérique" dans la section "Informations sur le périphérique" dans le panneau de droite
  • Faites glisser votre rapport de plantage dans la colonne de gauche du panneau présenté
  • Xcode symbolisera automatiquement le rapport de panne et affichera les résultats Pour symboliser un rapport de panne, Xcode doit être en mesure de localiser les éléments suivants:

    1. Le fichier binaire et dSYM de l'application en panne.

    2. Les fichiers binaires et dSYM pour tous les frameworks personnalisés auxquels l'application est liée. Pour les frameworks qui ont été construits à partir des sources avec l'application, leurs fichiers dSYM sont copiés dans l'archive avec le fichier dSYM de l'application. Pour les frameworks créés par un tiers, vous devrez demander à l'auteur le fichier dSYM.

    3. Symboles du système d'exploitation sur lequel cette application était en cours d'exécution lorsqu'elle s'est plantée. Ces symboles contiennent des informations de débogage pour les frameworks inclus dans une version spécifique du système d'exploitation (par exemple, iOS 9.3.3). Les symboles du système d'exploitation sont spécifiques à l'architecture - une version d'iOS pour les appareils 64 bits n'inclura pas de symboles armv7. Xcode copiera automatiquement les symboles du système d'exploitation de chaque appareil que vous connectez à votre Mac.

Si l'un de ces éléments est manquant, Xcode peut ne pas être en mesure de symboliser le rapport d'incident, ou peut ne symboliser que partiellement le rapport d'incident.

Ethan
la source
2

Le processus le plus simple pour symboliser les journaux de panne:

  1. conserver le fichier xcarchive de l'organisateur pendant le processus de construction IPA pour une utilisation future.
  2. Lorsque le plantage se produit, collectez les journaux de plantage du périphérique concerné. L'extension doit être .crash. Si le journal des pannes est au format .ips, renommez-le simplement en .crash.
  3. Double-cliquez sur xcarchive à partir du chemin stocké pour le faire apparaître dans l'organiseur (s'il n'est pas déjà présent).
  4. ouvrir dans la fenêtre xcode-> appareils et simulateurs -> afficher les journaux de l'appareil -> tous les journaux -> glisser-déposer le fichier .crash.

Attendez 5 secondes. Coup! les appels d'application dans la trace de pile seront symbolisés! Vous verrez peut-être encore beaucoup de symboles! ce sont des appels internes à la bibliothèque et au framework.

C'est le plus simple, essayé et testé!

Sanchita
la source
2

Apple vous donne le journal des plantages au format .txt, qui n'est pas symbolisé

**

Avec l'appareil connecté

**

  • Téléchargez le fichier ".txt", changez l'extension en ".crash" entrez la description de l'image ici
    • Ouvrez les appareils et les simulateurs à partir de l'onglet de la fenêtre dans Xcode
    • sélectionnez l'appareil et sélectionnez les journaux de l'appareil
    • glisser-déposer le fichier .crash dans la fenêtre du journal de l'appareil

entrez la description de l'image ici

Nous pourrons voir les journaux de crash symbolisés là-bas

Veuillez consulter le lien pour plus de détails sur la symbolisation des journaux de crash

Suraj K Thomas
la source