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: p> est-ce possible pour comprendre? p> p>
9 Réponses :
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. P>
Faire une macro qui ajoute la fonction __ __ code> 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. P>
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.
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. P>
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. P>
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. P>
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. P>
Quelle question essayez-vous vraiment de répondre? p>
@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.
Que diriez-vous Ce : crédits à l'auteur d'origine, Intropedro . p> p>
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.
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
Je reçois Erreur: AVERTISSEMENT: Impossible d'obtenir un pointeur CMD (remplacer NULL): Aucune variable nommée '_CMD' trouvé dans ce cadre code>
J'essayais d'attraper qui, comment et lorsque et lorsque vous modifiez la taille de la fenêtre et faisait du travail à la main:
NSLog(@"Show stack trace: %@", [NSThread callStackSymbols]);