Existe-t-il un moyen de déterminer la ligne de code à partir de laquelle un certain a method
été appelé?
ios
objective-c
debugging
nsthread
ennuikiller
la source
la source
Réponses:
J'espère que cela aidera:
la source
Dans un code entièrement optimisé, il n'y a pas de moyen sûr à 100% de déterminer l'appelant d'une certaine méthode. Le compilateur peut utiliser une optimisation des appels de fin tandis que le compilateur réutilise effectivement la trame de pile de l'appelant pour l'appelé.
Pour voir un exemple de cela, définissez un point d'arrêt sur une méthode donnée à l'aide de gdb et regardez la trace. Notez que vous ne voyez pas objc_msgSend () avant chaque appel de méthode. C'est parce que objc_msgSend () fait un appel final à l'implémentation 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 pour éviter ce seul problème.
Et ce n'est qu'un problème; en effet, vous vous demandez "comment réinventer CrashTracer ou gdb?". Un problème très difficile sur lequel les carrières sont faites. À moins que vous ne vouliez que les "outils de débogage" soient votre carrière, je vous déconseille de suivre cette voie.
À quelle question essayez-vous vraiment de répondre?
la source
En utilisant la réponse fournie par intropedro , j'ai trouvé ceci:
qui me renverra simplement Classe et fonction d'origine:
ps - si la fonction est appelée à l'aide de performSelector, le résultat sera:
la source
Je viens d'écrire une méthode qui fera cela pour vous:
la source
La version Swift 2.0 de la réponse de @ Intropedro pour référence;
la source
Si c'est pour des raisons de débogage, prenez l'habitude de mettre un
NSLog(@"%s", __FUNCTION__);
Comme première ligne à l'intérieur de chaque méthode de vos classes. Ensuite, vous pouvez toujours connaître l'ordre des appels de méthode en regardant le débogueur.
la source
Vous pouvez passer
self
comme l'un des arguments à la fonction, puis obtenir le nom de classe de l'objet appelant à l'intérieur:De cette façon, vous pouvez lui transmettre n'importe quel objet qui vous aiderait à déterminer où se situe le problème.
la source
Une version légèrement optimisée de la réponse fantastique de @Roy Kronenfeld:
la source
@ennuikiller
Dans la fenêtre de sortie, vous verrez quelque chose comme ce qui suit.
Vous pouvez également analyser cette chaîne pour extraire plus de données sur le cadre de pile.
Il a été tiré de Identify Calling Method dans iOS .
la source
La version Swift 4 de @Geoff H répond pour copier-coller ;]
la source
La version Swift 3 de @Geoff H répond pour référence:
la source