12
votes

Comment savoir qui a appelé une méthode?

Exemple: lorsque ma méthode -foobar est appelée, je souhaite qu'il se connecte à la console quelle méthode dont l'autre classe l'a appelée.

En ce moment, je sais seulement comment enregistrer le nom de la méthode de Foobar elle-même et C'est la classe, avec ceci: xxx

est-ce possible pour comprendre?


0 commentaires

9 Réponses :


3
votes

Ce n'est pas possible dans le cas général sans marquer de la pile. Il n'y a même pas une garantie qu'un autre objet envoie le message appelé méthode. Par exemple, cela pourrait être appelé à partir d'un bloc dans un gestionnaire de signal.


0 commentaires

1
votes

Cette information peut être obtenue à l'aide d'un dtrace .


0 commentaires

1
votes

Faire une macro qui ajoute la fonction __ __ au nom de la fonction à l'appel de la fonction. Cette macro appellera ensuite votre fonction avec un paramètre supplémentaire d'un char * à la fonction cible.


1 commentaires

Cela suppose que vous avez le contrôle de l'appelant et peut changer l'ABI entre l'appelant et la callee en modifiant l'argumentation, ce qui est rarement le cas.



35
votes

en code entièrement optimisé, il n'y a pas de moyen de 100% Sans% de déterminer l'appelant à une certaine méthode. Le compilateur peut utiliser une optimisation de l'appel de la queue alors que le compilateur réapplique efficacement le cadre de pile de l'appelant pour la callee.

Pour voir un exemple de ceci, définissez un point d'arrêt sur une méthode donnée à l'aide de GDB et regardez le backtrage. Notez que vous ne voyez pas objc_msgsend () avant chaque appel de méthode. C'est-à-dire que objc_msgsend () appelle une queue à la mise en œuvre de chaque méthode.

Bien que vous puissiez compiler votre application non optimisée, vous auriez besoin de versions non optimisées de toutes les bibliothèques système afin d'éviter que celui-ci un problème.

Et ceci est juste mais un problème; En effet, vous demandez "Comment puis-je réinventer CrashTracer ou GDB?". Un problème très dur sur lequel des carrières sont faites. Sauf si vous voulez que "des outils de débogage" soit votre carrière, je recommanderais de descendre cette route.

Quelle question essayez-vous vraiment de répondre?


1 commentaires

@ALEXGRAY Comment est-il une anti-réponse? La réponse est exactement précise de la portée et de l'ampleur du problème et, étant donné l'acceptation et la question finale, espérons que l'OP avait une voie de réussite.



2
votes

0 commentaires

6
votes

Que diriez-vous Ce : xxx

crédits à l'auteur d'origine, Intropedro .


1 commentaires

Cela ne fonctionnera pas dans le code entièrement optimisé car les optimisations d'appel de queue font que les cadres disparaissent entièrement de la pile.



2
votes

utilisateur la méthode ci-dessous de
Index Pass pour lequel vous souhaitez afficher la méthode et passer -1 si vous souhaitez afficher une pile complète de méthode xxx


1 commentaires

Je reçois Erreur: AVERTISSEMENT: Impossible d'obtenir un pointeur CMD (remplacer NULL): Aucune variable nommée '_CMD' trouvé dans ce cadre



0
votes

J'essayais d'attraper qui, comment et lorsque et lorsque vous modifiez la taille de la fenêtre et faisait du travail à la main: xxx


0 commentaires

2
votes
NSLog(@"Show stack trace: %@", [NSThread callStackSymbols]);

0 commentaires