Je veux savoir s'il existe un moyen de savoir où la fonction en cours d'exécution a été appelée, c'est-à-dire dans quel fichier et ligne. J'utilise le langage C, et je cherche quelque chose de similaire aux macros __FUNCTION__, __LINE__ ou __FILE__.Comment savoir quelle fonction est appelée une autre
Répondre
Renommer votre fonction
void Function(param1)
{
}
à
void Function_debug(param1, char * file, char * func, unsigned long line)
{
}
Puis #define une macro comme ceci:
#define Function(param1) Function_debug(param1, __FILE__, __FUNCTION__, __LINE__)
Et btw, cela signifie que votre code client restera inchangé. – bits
Oh, vraiment une façon belle et facile de le faire. Merci beaucoup Sérgio –
Si vous voulez vraiment remercier les bits, vous devez cliquer sur la case à cocher à gauche de sa réponse pour dire que c'est celui qui a résolu votre problème. – WillfulWizard
Rien dans C lui-même ne vous donnerait cette information. Vous pouvez soit tracer les informations vous-même (à l'entrée/sortie) ou vous fier aux API spécifiques à la plate-forme pour parcourir la pile des appels et déterminer la fonction d'appel, mais pas beaucoup plus.
Si vous avez besoin de le savoir à l'exécution, je ne pense pas que ce soit possible.
Si vous avez besoin de le savoir à debugtime, vous pouvez placer un point d'arrêt sur la fonction que vous voulez, puis, en utilisant GDB (en utilisant la commande bt) ou le débogueur de vistual studio, inspecter le courant STACK TRACE.
__FILE__
, __LINE__
etc sont des macros de préprocesseur qui peuvent facilement être étendues à la valeur correcte au moment de la compilation. Une fonction peut être appelée à partir de plusieurs endroits possibles, ce qui ne peut pas être fait via le préprocesseur. Trouver le nom de l'appelant serait très difficile; cela implique de parcourir la pile et de faire correspondre les adresses aux symboles.
Si vous pouvez vivre avec un petit hack, cela pourrait fonctionner (non testé):
/* Add a called argument to your function */
void _myFunction(char *caller, int more_args)
/* And define a macro that adds it automagically */
#define myFunction(a) _myFunction(__FUNCTION__, a)
C'est en fait un peu plus compliqué à faire. Votre meilleur pari est d'obtenir un backtrace sur un débogueur, ou trouver quelque chose de similaire à pstack pour votre plate-forme. La méthode manuelle impliquerait de parcourir la pile des appels et d'utiliser des symboles de débogage pour les traduire en fichiers et en lignes.
Vous pouvez utiliser des journaux.
#define BEGIN_FUNC(X,Y,Z) printf("Function %s Entered at line %d from file %s",X,Z,Y)
#define END_FUNC(X) printf("Function %s Exited at line %d from file %s",X,Z,Y)
foo()
{
BEGIN_FUNC(__func__,__FILE__,__LINE__);
//Your code here
END_FUNC(__func___FILE__,__LINE__);
}
OU
Utilisation bt dans gdb. Je l'appelle traçabilité.
Il n'y a rien qui soit supporté dans toutes les implémentations qui feront ce que vous voulez. Je parfois me suis retrouvé dans la même situation, où je devais suivre les appels pour quelques méthodes et a fait quelque chose comme ce qui suit:
#ifdef TRACKBACK
int foo(int arg1, int arg2, const char * file, int line)
{
SEND_TO_LOG("foo", file, line);
#else
int foo(int arg1, int arg2)
{
#endif
...
...
Bien sûr, il fait un peu d'un mal de tête à la fin d'appel, de sorte que vous aurez envie de faire quelque chose comme:
#ifdef TRACKBACK
#define TRACKING, __FILE__, __LINE__
#else
#define TRACKING
#endif
l'appel:
foo(arg1, arg2 TRACKING); //note the lack of the comma
Il fait l'affaire quand tout le reste échoue.
- 1. Comment puis-je déterminer quelle fonction est appelée une autre fonction dans ActionScript 2?
- 2. Comment savoir lorsqu'une fonction d'une autre classe a été appelée
- 3. Déterminer quelle fonction est appelée par une fonction générique
- 4. Comment puis-je savoir quelle fonction JavaScript est appelée lorsque je clique sur quelque chose sur une page?
- 5. Comment puis-je savoir si une fonction est appelée statiquement en PHP?
- 6. Struts quelle méthode est appelée?
- 7. Comment savoir où la méthode javascript est définie et quelle méthode est appelée en utilisant firebug
- 8. Comment savoir si une fonction est terminée?
- 9. Ruby: quelle méthode est appelée?
- 10. Comment extraire le nom d'une variable dans une fonction appelée depuis une autre fonction dans R?
- 11. Comment puis-je savoir dans quel fichier ou module ma fonction est appelée?
- 12. Jquery: comment savoir quelle ligne est sélectionnée?
- 13. Quelle est cette technique appelée en Java?
- 14. Comment savoir de quelle classe est une instance d'objet? (php5)
- 15. Quelle est la syntaxe C# appelée?
- 16. Comment puis-je savoir si l'action de mon contrôleur est appelée depuis une autre action du contrôleur?
- 17. est-classe étant appelée d'une autre classe
- 18. Comment savoir quelle classe est référencée par un objet Class?
- 19. Comment savoir si une fonction est définie dans php
- 20. Vim: Comment savoir où une fonction est définie? .. (
- 21. Comment savoir quelle fonction de hachage a été utilisée?
- 22. Pourquoi gprof me dit qu'une fonction appelée une seule fois par main() est appelée 102 fois?
- 23. Tester si une fonction est appelée en utilisant Mocha
- 24. Ma fonction "drawView" est appelée une seule fois?
- 25. Pourquoi ma fonction est appelée deux fois?
- 26. Quelle méthode d'initialisation est appelée dans une sous-classe UIViewController, lorsqu'elle est initialisée par une plume?
- 27. comment est appelée pageLoad()?
- 28. savoir à quelle page l'iframe est sur
- 29. Comment implémenter lambda comme une fonction appelée "lambda" dans Clojure?
- 30. Quelle est la méthode déléguée appelée lorsqu'un MKPinAnnotationView est touché?
Vous pouvez y parvenir en utilisant des macros. Regardez ma solution. – bits
Si vous voulez réellement que ce soit des données que vous pouvez utiliser dans votre code, c'est une requête inhabituelle. Pourquoi vous voulez ceci? Peut-être que nous pouvons vous aider à résoudre le problème qui a déclenché cette question? – WillfulWizard