46 votes

Comment un journal de toutes les méthodes utilisées dans l'app iOS

Je prends le développement d'une application iPad pour un client. Il y a une quantité de travail considérable qui a déjà été fait et je suis en train de reconstituer la façon la chose entière est conçu pour s'exécuter.

Une des choses que je voudrais faire est de connecter les méthodes appelée lorsque l'application s'exécute. J'ai vu une coutume de DTrace script qui est censé journal de toutes les méthodes de démarrage, mais quand je le lance dans les Instruments je n'obtiens aucun résultat.

Quelle est la meilleure manière de se connecter les méthodes?

57voto

Brad Larson Points 122629

Inspiré par tc, en réponse à une question similaire ici, j'ai mis en place un déboguer le point d'arrêt de l'action qui se déconnecter de la classe et le nom de la méthode à chaque fois objc_msgSend() est déclenchée dans votre application. Cela fonctionne de la même manière à la DTrace script que j'ai décrit dans cette réponse.

Pour activer ce point d'arrêt de l'action, créer une nouvelle symbolique point d'arrêt (dans Xcode 4, rendez-vous au point d'arrêt navigateur et de créer une nouvelle symbolique point d'arrêt le plus en bas à gauche de la fenêtre). Ont le symbole objc_msgSend, il continue automatiquement après l'évaluation des actions, et de définir l'action à un débogueur de commande en utilisant les éléments suivants:

printf "[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)),*(long *)($esp+8)

Votre point d'arrêt doit ressembler à ce qui suit:

Breakpoint action

Cette session messages comme celui-ci lors de l'exécution à l'encontre de votre application:

[UIApplication sharedApplication]
[UIApplication _isClassic]
[NSCFString getCString:maxLength:encoding:]
[UIApplication class]
[SLSMoleculeAppDelegate isSubclassOfClass:]
[SLSMoleculeAppDelegate initialize]

Si vous vous demandez où j'ai tiré les adresses de la mémoire, de lire ce Phrack article sur l'Objective-C runtime internes. Les adresses mémoire ci-dessus ne fonctionnera que sur le Simulateur, de sorte que vous pourriez avoir besoin d'ajuster ceci à l'encontre des applications sur les appareils iOS. Collin suggère la modification suivante dans sa réponse à l'exécuter sur un périphérique:

printf "[%s %s]\n", (char *)object_getClassName($r0),$r1

Aussi, je pense que vous verrez que l'enregistrement de chaque méthode appelée dans votre application vous submerger d'informations. Vous pourriez être en mesure d'utiliser certaines conditions de filtre, mais je ne sais pas si cela va vous aider à apprendre votre code s'exécute.

19voto

warhammerkid Points 795

Si vous utilisez LLDB, vous devez utiliser les commandes du débogueur. Elles ont été testées dans Xcode 4.6.

Appareil:

expr -- (void) printf("[%s %s]\n", (char *)object_getClassName($r0),$r1)

Simulateur:

expr -- (void) printf("[%s %s]\n", (char *)object_getClassName(*(long*)($esp+4)), *(long *)($esp+8))

5voto

collin Points 123

Brad Larson approche peut être adaptée pour fonctionner sur l'appareil en utilisant le débogueur de commande:

printf "[%s %s]\n", (char *)object_getClassName($r0),$r1

Plus d'informations peuvent être trouvées dans la Note Technique ici: les notes techniques

4voto

Ali Kıran Points 159

plus tard, xcode versions, vous devez appeler comme ça

expr -- (void)printf("[%s, %s]\n",(char *) object_getClassName(*(long*)($esp+4)), (char *) *(long *)($esp+8) )

1voto

DenVog Points 1588

Un autre développeur m'a appris à ajouter le même journal deux états pour chaque méthode. L'un à la première ligne, l'autre sur la dernière ligne. Je pense qu'il a un script qui le fait automatiquement pour ses projets, mais le résultat est le suivant:

NSLog(@"<<< Entering %s >>>", __PRETTY_FUNCTION__);
NSLog(@"<<< Leaving %s >>>", __PRETTY_FUNCTION__);

Au niveau de la console, cela va cracher quelque chose comme:

 <<< Entering -[MainListTableViewController viewDidLoad] >>>

Très utile dans le suivi de ce qui se passe.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X