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:
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.