selon Réponse , il devrait imprimer tous les noms de fonction: mais pourquoi ça ne fonctionne pas pour moi? P> P>
3 Réponses :
Vous n'avez pas réellement implémenté d'instrumentation. Le commutateur code> -Finstrument code> indique simplement à GCC d'appeler une fonction à l'entrée et à la sortie de chaque fonction. Mais vous devez définir ces fonctions vous-même (normalement cela se fait en reliant une bibliothèque de profileur dans). P>
Quelles étapes supplémentaires dois-je prendre pour travailler avec -Finstrument-fonctions code> commutateur? J'espère que cela sera aussi minime que possible ...
@ compile-fan: le Documentation a > mentionne les deux fonctions qui doivent être mises en œuvre. Je ne sais pas s'il existe une bibliothèque à l'emploi qui les utilise.
Ceci est à partir du manuel de la GCC:
-Finstrument-fonctions p>
Générer des appels d'instrumentation pour entrée et sortie sur les fonctions. Seulement Après une entrée de fonctionnement et juste avant sortie de fonction, le profilage suivant Les fonctions seront appelées avec le adresse de la fonction en cours et son site d'appels. (Sur certaines plates-formes, __builtin_return_address ne fonctionne pas au-delà de la fonction actuelle, de sorte que le Les informations sur le site d'appel peuvent ne pas être Disponible pour les fonctions de profilage sinon.) p>
void __cyg_profile_func_enter (void * this_fn, vide * call_site); p>
void __cyg_profile_func_exit (void * this_fn, vide * call_site); p> BlockQuote>
Sauf si quelque chose implémente ces fonctions, vous obtiendrez des erreurs de liaison (ce qui se passe avec Mingw). Éventuellement, votre version de GCC fournit des implémentations vides. P>
Je l'ai eu pour travailler avec MingW GCC en fournissant cette implémentation: p>
xxx pré> mais cela ne donne que le Adresses de fonction. J'aurais pensé qu'il devrait y avoir une implémentation par défaut de la GCC de cela, mais il ne semble pas y avoir. P>
Les gens peuvent également être intéressés par Cette visualisation de l'arborescence d'appel , qui utilise les fonctions -Fintrument-fonctions Drapeau - CAVEAT, je ne l'ai pas essayé moi-même. p> p>
@Neil Butterworth, puis-je ajouter ces 2 fonctions dans mon fichier .C code> manuellement?
Vous pourriez, mais les mettre en œuvre est assez compliqué.
@Neil Butterworth, je veux juste qu'il imite les noms de fonction, pourquoi est-ce compliqué?
Parce que vous n'êtes pas passé les noms de fonction dans ces deux fonctions.
Vous devez compiler le code que j'ai donné séparément, en tant que code C, sans i> le drapeau-fonctions -finstrument, puis liez le fichier .O résultant avec votre code. Cela fonctionne pour moi sur Mingw GCC 4.5.1, mais je ne peux pas garantir d'autres plates-formes.
@Neil Butterworth, je reçois Référence non définie à Code> Main'` lors de la compilation séparément:
GCC -Wall Profile.c -O Profil code>
... ou au lieu de compiler séparément, vous pouvez ajouter __ attribut __ ((no_instrument_function)) code> à la déclaration du
__ cyg_profile_func_xxx code> Fonctions, qui arrêtera
-Finstrument-fonctions code> Instruire l'instrumentation.
@Neil Butterworth, gcc -wall profile.c -o profil -c -c code> fonctionne, mais lors de la liaison contre celui-ci:
GCC -WALL HW.C -O HW -Finstrument-Fonctions -G -LProfile -L. Code>, obtenir
ne peut pas trouver -lprofile code> :(
gcc -c profil.c -o profil.o code>, puis
gcc -finstrument-fonctions hw.c profil.o -o hw code> - note profil.o n'est pas une bibliothèque .
@Neil Butterworth, ça marche maintenant! Mais je pense que profil.o code> est une bibliothèque statique (comme le fichier archive), le pensez-vous?
Non, c'est un fichier d'objet. Vous pouvez créer une bibliothèque avec ar rvs libprofile.a profil.o code>.
@Neil Butterworth, parlons de cela dans un fil séparé :) Stackoverflow.com/questions/6177498/...
Bonjour, quelle est la différence entre cette option et -pg code>?
codage __cyg_profile_func_enter et __cyg_profile_func_exit n'est pas compliqué. La solution la plus simple consistera à ce que les fonctions ci-dessus écrivent les détails de l'adresse dans un fichier et disposent d'un processus séparé pour lire les adresses du fichier et les résoudre à l'aide de la table des symboles de l'exécutable. Si vous essayez de faire une résolution d'adresse dans la fonction elle-même, cela peut prendre un certain temps. P>
j'ai rencontré après l'article - http: //balau82.wordpress. COM / 2010/10/06 / Trace-and-profil-fonction-appels-with-gcc / p>
qui utilise addr2line de Binutils à cette fin. Vérifiez si cela vous aide p>
Parfois .. Il est vraiment utile de simplement imprimer des noms FN pour le débogage de l'exactitude