Atos et Dwarfdump ne symboliseront pas mon adresse
J'ai reçu un rapport d'incident via des Aérofreins.io qui n'est pas symbolicated. Depuis le rapport de crash n'est pas exactement dans le même format qu'une Pomme de fermeture inopinée je ne peux pas il suffit de le déposer sur XCode comme d'habitude, j'ai donc pris l'exacte même build de mon XCode archive essayé de symbolicate sur la ligne de commande. Avec le résultat suivant:
$ atos -o kidsapp.app/kidsapp 0x0002fc4c
0x0002fc4c (in kidsapp)
Je suis absolument sûr que je suis en utilisant la même construction que le rapport de crash est de. Donc, j'ai aussi essayé avec dwarfdump:
$ dwarfdump --lookup 0x0002fc4c --arch armv7 kidsapp.app.dSYM
----------------------------------------------------------------------
File: kidsapp.app.dSYM/Contents/Resources/DWARF/kidsapp (armv7)
----------------------------------------------------------------------
Looking up address: 0x000000000002fc4c in .debug_info... not found.
Looking up address: 0x000000000002fc4c in .debug_frame... not found.
Également sans résultat. Est-il rien d'autre à part l'utilisation de la mauvaise dSYM fichier que j'ai pu faire de mal? Je sais que c'est la bonne puisque c'est la version mentionné dans le rapport de crash dans les Aérofreins et il est dans mon XCode archive.
Toutes les idées/conseils sont les bienvenus!
source d'informationauteur Mac_Cain13
Vous devez vous connecter pour publier un commentaire.
Tout d'abord, vérifiez si le dSYM est vraiment le plus approprié pour cette application:
Les deux doivent retourner le même résultat.
Vérifier si le dSYM a tout contenu valide
Cela devrait au moins donner quelques infos, autres que
not found
.Je suppose que le dSYM est corrompu. En général, vous pourriez vouloir utiliser un crash reporter qui vous donne plein rapport de crash avec tous les fils et dernière exception trace de l'information. Je recommande d'utiliser quelque chose de basé sur PLCrashReporter, par exemple QuincyKit (Open Source SDK + Serveur + symbolication sur votre mac) ou HockeyApp (Open Source SDK + service payant + côté serveur symbolication) (Note: je suis l'un des développeurs les deux!)
J'ai utilisé la suite de l'arithmétique à la figure:
slide
+stack address
-load address
=symbol address
et
stack address
est la valeur hexadécimale que je reçois de mon vidage de pile rapport de crash (pas un .crash fichier, il suffit de le vidage de pile).et
slide
est le vmaddr de la LC_SEGMENT cmd lors de l'exécution deotool -arch armv7 -l APP_BINARY_PATH
. Mine termine généralement par 0x00001000.et
load address
est la pièce compliquée. C'est en fait la différence entre le bas de la pile l'adresse de la thread principale et la PREMIÈRE adresse de la partie de mon fichier binaire qui contient des symboles lors de l'exécution dedwarfdump --arch armv7 --all DSYM_BINARY_PATH
. C'est tout simplement la symbolique de l'adresse de l'main
fonction. Donc, si vos résultats les plus crash adresse est 0x8000 et votre principale fonction symbolique de l'adresse est 0x2000 alors votreload address
est 0x6000.Maintenant, avec TOUTES ces pièces, je peux calculer le symbole de l'adresse et placez-la dans atos ou dwarfdump:
dwarfdump --lookup SYM_ADDR --arch armv7 APP_BINARY_PATH
.Exemple de la décharge (vous pouvez voir que le
load address
était 0x00003af4):La partie la plus difficile a été de réaliser que l'un des 2 bibliothèques statiques j'avais compris a leurs symboles dépouillé avant d'être le lien de mon application binaire! Qui a laissé un ÉNORME écart de symbole adresses alors je n'en ai terminé avec les deux tiers des symboles j'avais besoin dans mon dSYM.
Assurez-vous d'avoir les options suivantes à régler sur NON dans vos bibliothèques statiques xcode projet, de sorte que, lorsque vous vous connectez, vous pouvez tirer dans les symboles de votre application binaire (qui peut par la suite être dépouillé):
COPY_PHASE_STRIP
DEAD_CODE_STRIPPING
etSTRIP_INSTALLED_PRODUCT
.Maintenant, vous pouvez demander, "que dois-je faire si le vidage de pile ne comprend pas la fonction principale, car il n'est pas sur le thread principal, de sorte que je ne peux pas obtenir la fonction principale de la pile d'adresse?". Pour que je lui aurais répondu, "je n'ai pas un putain la moindre idée!". Juste croiser les doigts et espérons que vous pouvez obtenir une trace de la pile qui comprend le symbole de l'adresse ou de l'utilisation d'un crash système de rapports qui imite Apple crash journaux, comme PLCrashReporter.
[MODIFIER 26 Mai 2013] -
Il a été porté à mon attention que les
load address
est vraiment l'adresse de l'mach-o binaire. Si ce que j'ai décrit ci-dessus peut souvent - ce n'est pas vraiment correct. Ceci peut être obtenu par le RAPPORT de CRASH, toutefois, le point de cette réponse a été de fournir les symboles d'un crash lorsque vous ne disposez pas d'un rapport de crash. La meilleure façon que j'en suis venu à comprendre laload address
quand on veut symbolicate est de s'assurer que je me connecte leload address
avec lestack addresses
.J'ai personnellement créé un système d'enregistrement des accidents (pas les rapports de plantage) et de les avoir envoyés à un compartiment S3 où je peux les récupérer plus tard pour le débogage. Lorsque je démarre mon application que je cache la
slide
leload address
et lamain function address
pour une utilisation si mon application se bloque et j'ai envoyer lestack addresses
.REMARQUE: le dyld fonctions utilisent
#include <mach-o/dyld.h>
slide
= l'adresse retournée par_dyld_get_image_vmaddr_slide(0)
load address
= l'adresse retournée par_dyld_get_image_header(0)
main function address
= la dernière adresse[NSThread callStackReturnAddresses]
quandappelé sur le thread principal
Au crash de temps, je suis certain de vous connecter
[NSThread callStackReturnAddresses]
et[NSThread callStackSymbols]
ainsi que l'architecture qui peut être récupérer par le fait d'avoir cette méthode:Je ne sais pas encore comment différencier entre armv7 et armv7s.
Si cela peut aider dans le futur. J'ai l'intention de tout ce que j'ai appris et le transformer en un simple crash de l'outil de mieux que le de lotan outil (probablement de lotan v2).
J'ai mis à jour de lotan à l'appui de la fourniture de l'
load address
manuellement: https://github.com/NSProgrammer/natosPour qui que certains moments n'ont pas la valeur de l'Adresse de Chargement comme ceci:
J'ai créé un simple bash pour m'aider à déboguer:
Il se contente de lire le chemin d'accès de l'application, le nom de l'application, l'exécution de l'adresse et de la valeur après le "+" du signal (valeur décimale) et ensuite trouver la valeur de l'adresse de chargement pour exécuter atos commande.
Je pense que ce post peut vous aider, https://stackoverflow.com/a/12559150/1773317.
Joe s'engager à semelles de mon problème.
La raison en est que mon .app et .dSYM fichiers ne peuvent pas être indexés par spotlight, donc mon XCode ne peut pas symbolicate le crash de l'info correctement.
Vous pouvez essayer et utiliser un script que j'ai écrit pour symbolicate à l'aide de atos commande:
https://github.com/IdoTene/MacosSymbolicateCrash
Mon cas:
Je reçois le crash chaînes de la NSException.callStackSymbols.
Le crash trace de la pile semble de cette façon:
Ne comprennent pas bitcode, comme Apple peut recompiler votre code, et dsym des fichiers à partir d'archives de l'Organisateur ne correspond pas.
Exécutez ce script bash:
En supposant que vous avez créé un test.sh (touch test.sh). Si il n'est pas possible d'exécuter le sctipt (./test.sh) en raison d'un problème d'autorisations: l'appel de la commande chmod +x test.sh Maintenant ./test.sh devrait fonctionner. Et générer le résultat.
Ainsi il est possible de symbolicate l'écrasement de fichiers à l'aide de AppName.app.dSYM fichier: