2014-06-25 2 views
1

Dans une application de production avec les informations de débogage dépouillé, comment convertir la sortie:iOS: convertir l'entrée StackTrace au nom de la méthode avec le numéro de ligne

NSLog(@"Stack Trace: %@", [exception callStackSymbols]); 

à une classe lisible et nom de la méthode? Un numéro de ligne serait une bénédiction.

est ici la sortie que je reçois:

0 CoreFoundation      0x23d82f23 <redacted> + 154 
1 libobjc.A.dylib      0x23519ce7 objc_exception_throw + 38 
2 CoreFoundation      0x23cb92f1 <redacted> + 176 
3 MyApp        0x23234815 MyApp + 440341 

La dernière ligne est le pain et le beurre ligne, mais quand je l'utilise nain pour trouver l'adresse, rien n'existe.

dwarfdump --arch armv7 MyApp.dSYM --lookup 0x00234815 | grep 'Line table' 

J'ai lu ici que vous avez besoin de convertir l'adresse de la pile à quelque chose d'autre nain ou atos:

https://stackoverflow.com/a/12464678/2317728

Comment puis-je trouver l'adresse de chargement ou l'adresse de diapositives pour effectuer la calcul? N'y a-t-il pas un moyen de calculer tout cela avant d'envoyer la pile dans le journal à partir de l'application? Si non, comment puis-je déterminer et calculer ces valeurs après avoir reçu la trace de la pile? Mieux encore, y a-t-il une solution plus facile qui me manque?

Remarque Je ne peux pas attendre les rapports de blocage car l'application est petite et ne viendra jamais. Je prévois d'envoyer les traces de la pile à notre serveur pour qu'elles soient corrigées dès qu'elles apparaissent.

EDITORIAL

Les outils de reporting crash dans iOS sont très rugueux, en particulier par rapport à Android. Dans Android, les lignes buggy sont envoyés à Google Analytics, vous utilisez la carte pour déboguer la ligne - simple (comparativement). Pour iOS, vous devez: a) attendre les rapports de bogues de l'utilisateur (pas raisonnable pour une petite application), b) envoyer des traces de pile à un serveur où il y a peu d'outils ou d'informations sur la façon de symboliser les traces de pile, c) sur de grandes bibliothèques tierces quasi commerciales. Cela rend définitivement plus difficile la construction et la mise à l'échelle - en espérant qu'Apple finira par s'en rendre compte. Encore plus d'espoir quelqu'un a repéré une solution plus facile que je pourrais avoir manqué;)

Merci pour votre aide!

+2

Avez-vous regardé https://www.plcrashreporter.org/ qui alimente un grand nombre de ceux qui ont signalé l'accident commercial prestations de service? Il semble que vous soyez sur le point d'essayer de réinventer une grande partie de cet outil. – Jonah

+0

Merci pour la suggestion - ils semblent être une bonne offre, mais la taille de ce projet est plusieurs fois la taille de mon application. Si je pouvais juste comprendre comment transposer la sortie en quelque chose d'intelligible, les choses du serveur prendraient juste 30 minutes et je pourrais éviter d'ajouter une grande base de code tierce partie au projet. –

+1

Quelques remarques: 1. vous n'obtiendrez des rapports qu'avec des exceptions via ce mécanisme, pas de plantage causé par le gestionnaire de signal. 2. Pour symboliser les données de 'callStackSymbols', vous devez écrire votre propre analyseur et logique et utiliser' atos' avec les paramètres corrects. 3. La taille de PLCrashReporter est exactement quoi? Le code, le binaire de la bibliothèque statique? Les deux ne donnent pas un indice sur la taille de votre application, sauf si vous la liez et que vous vérifiez. 4. Envoyer des rapports d'erreur lorsque l'exception se produit est une mauvaise mauvaise idée. 5. Les accidents/exceptions sont très différents de ce que vous savez d'Android. N'utilisez pas la même approche! – Kerni

Répondre

0

Une suggestion, vous pouvez facilement obtenir le nom de la méthode, la raison d'exception et le numéro de ligne à l'aide:

NSLog(@"%@ Exception in %s on %d due to %@",[exception name],__PRETTY_FUNCTION__,__LINE__,[exception reason]); 
+0

Merci d'avoir ajouté le .name et .reason.Le reste pointe malheureusement vers la ligne dans mon gestionnaire d'exception. Je ne pense pas non plus que cela fonctionnerait avec les symboles supprimés dans une application de production. –

Questions connexes