Je cherche à essayer de symboliser les rapports de plantage de mon application iPhone.
J'ai récupéré les rapports d'incident sur iTunes Connect. J'ai le binaire d'application que j'ai soumis à l'App Store et le fichier dSYM généré dans le cadre de la construction.
Tous ces fichiers sont regroupés dans un seul répertoire indexé par Spotlight.
Et maintenant?
J'ai essayé d'invoquer:
symbolicatecrash crashreport.crash myApp.app.dSYM
et il ne fait que produire le même texte que celui qui se trouve dans le rapport d'incident, mais il n'est pas symbolique.
Est-ce que je fais quelque chose de mal?
Étapes à suivre pour analyser le rapport d'incident d'Apple:
Copiez le fichier de publication .app qui a été placé dans l’Appstore, le fichier .dSYM créé au moment de la publication et le rapport de blocage reçu d’Apple dans un DOSSIER.
Ouvrez l'application Terminal et accédez au dossier créé ci-dessus (à l'aide de la commande cd
)
Exécutez atos -Arch armv7 -o APPNAME.app/APPNAME MEMORY_LOCATION_OF_CRASH
. L'emplacement de la mémoire doit être celui sur lequel l'application s'est bloquée conformément au rapport.
Ex: atos -Arch armv7 -o 'APPNAME.app'/'APPNAME' 0x0003b508
Cela vous montrerait la ligne exacte, nom de la méthode qui a provoqué un crash.
Ex: [classname functionName:]; -510
Symbolicating IPA
si nous utilisons IPA pour symboliser - il suffit de renommer l'extension .ipa avec .Zip, l'extraire pour obtenir un dossier Payload contenant l'application. Dans ce cas, nous n’avons pas besoin du fichier .dSYM.
Remarque
Cela ne peut fonctionner que si le binaire de l'application n'a pas de symboles supprimés. Par défaut, la version crée dépouillé les symboles. Nous pouvons le changer dans les paramètres de construction du projet "Dégrader les symboles de débogage lors de la copie" en NO.
Plus de détails voir ceci post
Après avoir lu toutes ces réponses ici afin de symboliser un journal de plantage (et finalement de réussir), je pense que certains points manquent 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 être combinés pour symboliser un journal des collisions:
example.crash
), soit exporté depuis l'organiseur de XCode, soit reçu depuis iTunes Connect..app
(c'est-à-dire example.app
) qui contient lui-même le fichier binaire de l'application appartenant au journal des incidents. Si vous avez un package .ipa
(c'est-à-dire example.ipa
), vous pouvez extraire le package .app
en décompressant le package .ipa
(c'est-à-dire unzip example.ipa
). Ensuite, le package .app
réside dans le dossier Payload/
extrait..dSYM
contenant les symboles de débogage (c.-à-d. example.app.dSYM
)Avant de commencer la symbolique, vous devez vérifier si tous ces artefacts correspondent, ce qui signifie que le journal des incidents appartient au binaire que vous avez et que les symboles de débogage sont ceux produits lors de la construction de cet binaire.
Chaque fichier binaire est référencé par un UUID visible dans le fichier journal du crash:
...
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 incidents appartient à une image binaire d'application nommée example.app/example avec UUID aa5e633efda8346cab92b01320043dc3
.
Vous pouvez vérifier l’UUID du paquet 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 également appartiennent à 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 sont compatibles et vous devriez pouvoir symboliser votre stacktrace.
Passage au script symbolicatecrash
:
Dans Xcode 8.3, vous devriez pouvoir appeler le script via
/Applications/Xcode.app/Contents/SharedFrameworks/DVTFoundation.framework/Versions/A/Resources/symbolicatecrash -v example.crash 2> symbolicate.log
Si ce n'est pas le cas, vous pouvez exécuter un find . -name symbolicatecrash
dans votre répertoire Xcode.app pour le trouver.
Comme vous pouvez le constater, aucun autre paramètre n’est donné. Le script doit donc trouver les symboles binaires et de débogage de votre application en effectuant 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"
Le premier appel Spotlight vous donne tous les packages dSYM indexés et le second vous donne les packages .dSYM
avec un UUID spécifique. Si spotlight ne trouve pas votre package .dSYM
, alors symbolicatecrash
ne le fera pas non plus. Si vous faites tout ça, par exemple dans un sous-dossier de votre ~/Desktop
, Spotlight devrait pouvoir tout trouver.
Si symbolicatecrash
trouve votre paquet .dSYM
, 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 package .app
, une recherche Spotlight semblable à celle ci-dessous est appelée par symbolicatecrash
:
mdfind "kMDItemContentType == com.Apple.application-bundle && (kMDItemAlternateNames == 'example.app' || kMDItemDisplayName == 'example' || kMDItemDisplayName == 'example.app')"
Si symbolicatecrash
trouve votre paquet .app
, l'extrait suivant devrait figurer 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 par symbolicatecrash
, il convient d’imprimer la version symbolisée de votre journal des pannes.
Sinon, vous pouvez directement transférer 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 symbolique est sortie vers le terminal et non pas symbolicate.log
.
Avec la dernière version de Xcode (3.2.2), vous pouvez faire glisser tout rapport d’incident dans la section Journaux de périphérique de Xcode Organizer. Ils seront automatiquement symbolisés à votre place. Je pense que cela fonctionne mieux si vous avez construit cette version de l'application à l'aide de Build & Archive (faisant également partie de Xcode 3.2.2).
Je l'ai fait avec succès, en utilisant les étapes suivantes.
Étape 1: Créez un dossier sur le bureau, je le nomme "CrashReport" et mets trois fichiers ("MYApp.app", "MyApp.app.dSYM", "MYApp_2013-07-18.crash") en elle.
Étape 2: Ouvrez le Finder et allez dans Applications, où vous trouverez l’application Xcode, faites un clic droit dessus et cliquez sur "Afficher le contenu du paquet". Après cela, suivez ce chemin simple . "Contenu-> Développeur-> Plateformes-> iPhoneOS.platform-> Développeur-> Bibliothèque-> PrivateFrameworks -> DTDeviceKit.framework -> Versions-> A-> Ressources"
OU
"Contenu-> Développeur-> Plateformes-> iPhoneOS.platform-> Développeur-> Bibliothèque-> PrivateFrameworks -> DTDeviceKitBase.framework -> Versions-> A-> Ressources"
OR
À partir de Xcode 6, le chemin est Applications/Xcode.app/Contenu/SharedFrameworks/DTDeviceKitBase.framework/Versions/A/Resources.
Où vous trouvez le fichier "symbolicatecrash", copiez-le et collez-le dans le dossier "CrashReport".
Étape 3: / lancez le terminal, exécutez ces 3 commandes
cd/Users/mac38/Desktop/CrashReport et appuyez sur le bouton Entrée
export DEVELOPER_DIR = "/ Applications/Xcode.app/Contents/Developer" et appuyez sur Entrée
Je mets également dsym, le paquet d'applications et le journal des pannes ensemble dans le même répertoire avant d'exécuter crash symbolique
Ensuite, j'utilise cette fonction définie dans mon .profile pour simplifier l'exécution de symbolicatecrash:
function desym
{
/Developer/Platforms/iPhoneOS.platform/Developer/Library/PrivateFrameworks/DTDeviceKit.framework/Versions/A/Resources/symbolicatecrash -A -v $1 | more
}
Les arguments ajoutés peuvent vous aider.
Vous pouvez vérifier que spotlight "voit" vos fichiers dysm en exécutant la commande suivante:
mdfind 'com_Apple_xcode_dsym_uuids = *'
Cherchez le numéro que vous avez dans votre répertoire.
REMARQUE: Depuis la dernière Xcode, il n'y a plus de répertoire de développeur. Vous pouvez trouver cet utilitaire ici:
/Applications/Xcode.app/Contents/SharedFrameworks/DTDeviceKitBase.framework/Version/A/Ressources/symbolicatecrash
J'utilise Airbrake dans mes applications, ce qui fait un assez bon travail de consignation des erreurs à distance.
Voici comment je les symbolise avec atos si la trace en a besoin:
Dans Xcode (4.2), accédez à l'organiseur, cliquez avec le bouton droit de la souris sur l'archive à partir de laquelle le fichier .ipa a été généré.
Dans Terminal, cd dans xcarchive par exemple MyCoolApp 10-27-11 1.30 PM.xcarchive
Entrez le atos -Arch armv7 -o 'MyCoolApp.app'/'MyCoolApp'
suivant (n'oubliez pas les guillemets simples)
Je n'inclus pas mon symbole dans cet appel. Ce que vous obtenez est un curseur de bloc sur une ligne vide.
Ensuite, je copie/colle mon code de symbole sur le curseur de ce bloc et appuie sur Entrée. Vous verrez quelque chose comme:
-[MyCoolVC dealloc] (in MyCoolApp) (MyCoolVC.m:34)
Vous revenez à un curseur de bloc et vous pouvez coller d'autres symboles.
Le fait de pouvoir parcourir un élément de votre trace sans avoir à saisir de nouveau le premier bit vous permet de gagner du temps.
Prendre plaisir!
MISE À JOUR POUR XCODE 9
Connectez le périphérique iOS n'importe lequel à votre Mac (oui, physique, oui, je sais que c'est stupide)
Cliquez sur votre appareil à gauche et sur VIEW DEVICE LOGS à droite
Attendre. Cela peut prendre une minute pour se présenter. Peut-être que faire Command-A
puis Delete
accélèrera cela.
Étape critique non documentée:} _ renommer le rapport d'incident que vous avez obtenu d'iTunesConnect à partir de l'extension .txt
en extension .crash
Faites glisser le rapport d'accident dans cette zone à gauche
Et puis Xcode symbolisera le rapport d'incident et affichera les résultats.
Source: https://developer.Apple.com/library/ios/technotes/tn2151/_index.html
Juste une réponse simple et mise à jour pour xcode 6.1.1.
PAS
1.Xcode> Fenêtre> Périphériques.
2.Sélectionnez un appareil dans la liste des appareils de la section APPAREILS.
3. Sélectionnez Afficher les journaux du périphérique.
4.Sous la section Tous les journaux, vous pouvez directement faire glisser le report.crash
5.Xcode symbolise automatiquement le rapport d'incident pour vous.
6.Vous pouvez trouver le rapport d'incident Symbolized en faisant correspondre sa date/heure à la date/heure mentionnée dans votre rapport d'incident.
Même si je développais des applications depuis quelques années maintenant, c’était la première fois que je déboguais un fichier binaire et j’avais l’impression que NOOB découvrait où se trouvaient tous les fichiers, c’est-à-dire où se trouvaient * .app * .dSYM et les journaux des collisions? Je devais lire plusieurs posts pour le comprendre. L'image vaut mille mots et j'espère que ce billet aidera quelqu'un d'autre à l'avenir.
1- Allez d’abord sur itunesconnect et téléchargez vos journaux d’incidents. REMARQUE: Dans la plupart des cas, vous obtiendrez peut-être quelque chose comme "Trop peu de rapports ont été soumis pour qu'un rapport puisse être affiché." En gros, pas assez d'utilisateurs ont soumis des rapports de journal de plantage à Apple, auquel cas vous ne pouvez pas faire grand-chose à ce moment-là.
2- Maintenant, si vous n'avez pas changé votre code depuis que vous l'avez soumis à Apple, lancez Xcode pour ce projet et relancez Product -> Archive. Sinon, trouvez votre dernier fichier binaire soumis et cliquez dessus avec le bouton droit de la souris.
Avec XCode 4, la tâche est encore plus simple:
et voilà. Le fichier journal est importé et symbolisé automatiquement pour vous. Si vous avez archivé la construction en utilisant XCode -> Produit -> Archiver d'abord
Dans XCode 4.2.1, ouvrez Organizer, puis accédez à Library/Device Logs et faites glisser votre fichier .crash dans la liste des journaux de blocage. Il sera symbolisé pour vous après quelques secondes. Notez que vous devez utiliser la même instance de XCode sur laquelle la construction d'origine a été archivée (c'est-à-dire que l'archive de votre construction doit exister dans Organizer).
Magical XCode Organizer n’est pas aussi magique en ce qui concerne la symbolisation de mon application. Je n'ai aucun symbole pour les rapports d'incident que Apple m'a renvoyés après la soumission d'une application ayant échoué.
J'ai essayé d'utiliser la ligne de commande, en plaçant le rapport d'incident dans le même dossier que le fichier .app (que j'ai envoyé au magasin) et le fichier .dSYM:
$ symbolicatecrash "My App_date_blahblah-iPhone.crash" "My App.app"
Cela ne fournissait que des symboles pour mon application et non le code de base principal, mais c'était mieux que le dump numérique que l'Organizer me donnait et me suffisait pour trouver et réparer le crash de mon application. Si quelqu'un sait comment étendre cela pour obtenir les symboles de la Fondation, ce serait apprécié.
Dans mon cas, je glissais des rapports de plantage directement de Mail dans l’Organiseur. Pour une raison quelconque, cela a empêché les rapports d'accident de devenir symboliques (j'aimerais savoir pourquoi).
En copiant d'abord les rapports d'incident sur le Bureau, puis en les faisant glisser vers l'Organiseur, ils sont symbolisés correctement.
Cas très spécifique, je sais. Mais pensais que je partagerais juste au cas où.
La combinaison qui a fonctionné pour moi était:
Utilisation de atos Je n'ai pas pu résoudre les informations de symbole correctes avec les adresses et les décalages figurant dans le rapport de blocage. Lorsque j'ai fait cela, je vois quelque chose de plus significatif, qui semble être une trace de pile légitime.
Pour ceux qui utilisent Airbrake, il y a une réponse solide ci-dessus mais cela ne fonctionnerait pas pour moi sans peaufiner:
Fonctionne pour certaines adresses mémoire mais pas pour d'autres, vous ne savez pas pourquoi ...
Voici un autre problème que j'ai avec symbolicatecrash - cela ne fonctionnera pas avec les applications qui contiennent des espaces (par exemple, "Test App.app"). Notez que je ne pense pas que vous pouvez laisser des espaces dans leur nom lors de la soumission. Vous devez donc les supprimer quand même. Toutefois, si vous rencontrez déjà des accidents qui nécessitent une analyse, corrigez le symbole symbolececash (4.3 GM) en tant que tel:
240c240
< my $cmd = "mdfind \"kMDItemContentType == com.Apple.application-bundle && kMDItemFSName == $exec_name.app\"";
---
> my $cmd = "mdfind \"kMDItemContentType == com.Apple.application-bundle && kMDItemFSName == '$exec_name.app'\"";
251c251
< my $cmd = "find \"$archive_path/Products\" -name $exec_name.app";
---
> my $cmd = "find \"$archive_path/Products\" -name \"$exec_name.app\"";
J'ai dû faire beaucoup de piratage du script symbolicatecrash pour le faire fonctionner correctement.
Pour autant que je sache, symbolicatecrash nécessite à présent que le .app se trouve dans le même répertoire que le .dsym. Il utilisera le .dsym pour localiser le .app, mais n'utilisera pas le dsym pour trouver les symboles.
Vous devriez faire une copie de votre symbolicatecrash avant d’essayer ces patchs qui le feront apparaître dans le DSym:
Autour de la ligne 212 dans la fonction getSymbolPathFor_dsymUuid
212 my @executablePath = grep { -e && ! -d } glob("$dsymdir" . "/Contents/Resources/DWARF/" . $executable);
Autour de la ligne 265 dans la fonction matchesUUID
265 return 1;
C’est simple, après avoir recherché beaucoup, j’ai trouvé des étapes claires pour symboliser l’ensemble du fichier d’incident.
codage heureux,
Riyaz
Je préfère un script qui symbolisera tous mes journaux de crash.
Créez un dossier et mettez-y 4 choses:
symbolicatecrash
Script Perl - de nombreuses réponses SO indiquent son emplacement
L'archive de la construction qui correspond aux arrêts (de Xcode Organizer. Simple comme Show in Finder
et copier) [Je ne suis pas sûr que ce soit nécessaire]
Tous les packages xccrashpoint
- (à partir de Xcode Organizer. Show in Finder
, vous pouvez copier tous les packages du répertoire ou le seul xccrashpoint que vous souhaitez symboliser)
Ajoutez ce court script au répertoire:
#!/bin/sh
echo "cleaning old crashes from directory"
rm -P *.crash
rm -P *.xccrashpoint
rm -r allCrashes
echo "removed!"
echo ""
echo "--- START ---"
echo ""
mkdir allCrashes
mkdir symboledCrashes
find `ls -d *.xccrashpoint` -name "*.crash" -print -exec cp {} allCrashes/ \;
cd allCrashes
for crash in *.crash; do
../symbolicatecrash $crash > ../symboledCrashes/V$crash
done
cd ..
echo ""
echo "--- DONE ---"
echo ""
Lorsque vous exécutez le script, vous obtenez 2 répertoires.
allCrashes
- tous les accidents de tous les xccrashpoint
seront présents.
symboledCrashes
- les mêmes accidents, mais maintenant avec tous les symboles.
vous n'avez PAS besoin de nettoyer le répertoire des anciennes plantages avant d'exécuter le script. il va nettoyer automatiquement. bonne chance!
Afin de symboliser les blocages, Spotlight doit pouvoir rechercher le fichier .dSYM généré au même moment que le fichier binaire que vous avez envoyé à Apple. Comme il contient les informations sur le symbole, vous n'aurez aucune chance s'il n'est pas disponible.
atos est obsolète. Si vous utilisez OSX 10.9 ou une version ultérieure, vous devrez peut-être exécuter
xcrun atos
Avertissement:/usr/bin/atos se déplace et sera supprimé d'un futur système d'exploitation X release. Il est maintenant disponible dans les outils de développement Xcode sous la forme invoqué via:
xcrun atos
J'aime utiliser Textwrangler pour identifier les erreurs dans un rejet binaire d'origine de téléchargement d'application. (Les données sur l'incident se trouveront dans votre compte itunesConnect.) À l'aide de la méthode de Sachin ci-dessus, je copie l'original.crash dans TextWrangler, puis le fichier symbolicatecrash que j'ai créé dans un autre fichier TextWrangler. La comparaison des deux fichiers met en évidence des différences. Le fichier symbolicatecrash aura des différences qui indiquent le fichier et le numéro de ligne des problèmes.
Je suis un peu grincheux sur le fait que rien ici ne semble "fonctionner", alors j'ai fait quelques recherches et le résultat est:
Mettre en place: le back-end QuincyKit qui reçoit des rapports. Aucune symbolique n'a été mise en place, car je ne pouvais même pas commencer à comprendre ce qu'ils suggéraient de faire pour que cela fonctionne.
Le correctif: télécharger des rapports d'incident à partir du serveur en ligne. Ils s'appellent 'crash' et par défaut, ils vont dans le dossier ~/Téléchargements /. En gardant cela à l'esprit, ce script "fera le bon choix" et les rapports d'incidents seront intégrés à Xcode (organiseur, journaux des périphériques) et la symbolication sera effectuée.
Le scénario:
#!/bin/bash
# Copy crash reports so that they appear in device logs in Organizer in Xcode
if [ ! -e ~/Downloads/crash ]; then
echo "Download a crash report and save it as $HOME/Downloads/crash before running this script."
exit 1
fi
cd ~/Library/Logs/CrashReporter/MobileDevice/
mkdir -p actx # add crash report to xcode abbreviated
cd actx
datestr=`date "+%Y-%m-%d-%H%M%S"`
mv ~/Downloads/crash "actx-app_"$datestr"_actx.crash"
Les choses peuvent être automatisées jusqu'à l'endroit où vous pouvez glisser-déposer dans Xcode Organizer en faisant deux choses si vous utilisez QuincyKit/PLCR.
Tout d’abord, vous devez éditer le script distant admin/actionapi.php ~, ligne 202. Il ne semble pas que l’horodatage soit correct. point crash):
header('Content-Disposition: attachment; filename="crash'.$timestamp.'.crash"');
Deuxièmement, du côté iOS dans QuincyKit BWCrashReportTextFormatter.m ~ ligne 176, remplacez @"[TODO]"
par @"TODO"
pour éviter les mauvais caractères.
J'ai découvert que la plupart des alternatives proposées ne fonctionnaient pas dans le dernier XCode (testé avec Xcode 10). Par exemple, je n’ai pas eu de chance en glissant-déposant les journaux .crash dans Xcode -> Organiseur -> Journaux de périphérique -view.
Je recommande d'utiliser l'outil Symbolicator https://github.com/agentsim/Symbolicator