2016-11-22 8 views
2

Par exemple, vous avez TextEdit Application, lorsque vous enregistrez le fichier, je veux savoir quelles méthodes d'Objective-C sont appelées. J'ai un fichier d'en-tête de Textedit en utilisant class-dump.Comment trouver des méthodes objectives-c à l'exécution pour n'importe quelle application sur Mac?

Y at-il un moyen de savoir laquelle de ces méthodes (que nous produisons à partir de la classe-dump) est appelée à l'exécution?

est-il un moyen de le faire avec dtrace ??

Répondre

0

En supposant des méthodes Objective-C se traduisent directement aux appels de fonction-espace utilisateur, vous devriez pouvoir utiliser the DTrace pid provider:

Le pid Fournisseur

Le fournisseur pidvous permet de tracer une instruction dans un processus . Contrairement à la plupart des autres fournisseurs, les sondes pid sont créées en fonction de la demande , en fonction des descriptions de sonde trouvées dans vos programmes D.

Fonction utilisateur Limite Tracing

Le mode le plus simple de fonctionnement pour le fournisseur pid est que l'utilisateur analogique de l'espace au fournisseur fbt. L'exemple de programme suivant trace toutes les entrées de fonction et les retours qui sont créés à partir d'une seule fonction . La variable de macro $1 se développe au premier opérande sur la ligne de commande . Cette variable de macro est l'ID de processus du processus à trace. La variable macro $2 se développe sur le deuxième opérande de la ligne de commande . Cette variable de macro est le nom de la fonction à partir de laquelle tous les appels de fonction sont tracés.

Exemple 4-3 userfunc.d: User Trace Fonction Entrée et Retour

pid$1::$2:entry 
{ 
    self->trace = 1; 
} 

pid$1::$2:return 
/self->trace/ 
{ 
    self->trace = 0; 
} 

pid$1:::entry, 
pid$1:::return 
/self->trace/ 
{ 
} 

Ce script produit une sortie similaire à l'exemple suivant:

# ./userfunc.d 15032 execute 
dtrace: script './userfunc.d' matched 11594 probes 
    0 -> execute        
    0 -> execute        
    0  -> Dfix        
    0  <- Dfix        
    0  -> s_strsave       
    0  -> malloc       
    0  <- malloc       
    0  <- s_strsave       
    0  -> set        
    0  -> malloc       
    0  <- malloc       
    0  <- set        
    0  -> set1        
    0  -> tglob       
    0  <- tglob       
    0  <- set1        
    0  -> setq        
    0  -> s_strcmp       
    0  <- s_strcmp       
... 
+0

Merci pour vos informations. Mais j'ai besoin de plus. J'ai une classe-vidage de TextEdit. Dans ce que je veux savoir si - (BOOL) validateMenuItem: (id) arg1; de classe Le document est exécuté ou non. J'ai donc utilisé votre script et exécuté avec dtrace -s userfunc.d 1102 * validateMenuItem * ... Il indique que la description de la sonde ne correspond pas. Que faire?? –

+0

@hrishikeshchaudhari Le nom de la fonction peut ne pas être exactement 'validateMenuItem'. C'est probablement [mutilé] (https://en.wikipedia.org/wiki/Name_mangling). Je ne suis pas familier avec OS X pour dire quels utilitaires sont disponibles pour trouver des noms de fonctions mutilés dans les binaires. 'chaînes -a/bin/fichier | grep -i validateMenuItem' * pourrait fonctionner. Cela pourrait aider: http://stackoverflow.com/questions/4506121/how-to-print-a-list-of-symbols-exported-from-a-dynamic-library Réduire le script DTrace à quelque chose comme 'pid $ 1: :: entry {} 'pourrait émettre * tous * les appels de fonction que fait le processus. Je ne peux pas tester ça maintenant. –

+0

Vous avez probablement raison, les fonctions sont mutilées. Il n'y a maintenant moyen de le faire par ingénierie inverse ou par tâtonnement. Je me demande vraiment comment les gens font du swizzling. L'ingénierie inverse prendra probablement des jours pour trouver la fonction exacte à faire swizzling. –