8
votes

Pourquoi ne fonctionne-t-il pas `-Finstrument-Fonctions` fonctionne pour moi?

selon Réponse , il devrait imprimer tous les noms de fonction: xxx

mais pourquoi ça ne fonctionne pas pour moi?

gcc

0 commentaires

3 Réponses :


1
votes

Vous n'avez pas réellement implémenté d'instrumentation. Le commutateur -Finstrument 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).


2 commentaires

Quelles étapes supplémentaires dois-je prendre pour travailler avec -Finstrument-fonctions commutateur? J'espère que cela sera aussi minime que possible ...


@ compile-fan: le Documentation 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.



9
votes

13 commentaires

@Neil Butterworth, puis-je ajouter ces 2 fonctions dans mon fichier .C 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 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 à Main'` lors de la compilation séparément: GCC -Wall Profile.c -O Profil


... ou au lieu de compiler séparément, vous pouvez ajouter __ attribut __ ((no_instrument_function)) à la déclaration du __ cyg_profile_func_xxx Fonctions, qui arrêtera -Finstrument-fonctions Instruire l'instrumentation.


@Neil Butterworth, gcc -wall profile.c -o profil -c -c fonctionne, mais lors de la liaison contre celui-ci: GCC -WALL HW.C -O HW -Finstrument-Fonctions -G -LProfile -L. , obtenir ne peut pas trouver -lprofile :(


gcc -c profil.c -o profil.o , puis gcc -finstrument-fonctions hw.c profil.o -o hw - note profil.o n'est pas une bibliothèque .


@Neil Butterworth, ça marche maintenant! Mais je pense que profil.o 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 .


@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 ?



0
votes

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.

j'ai rencontré après l'article - http: //balau82.wordpress. COM / 2010/10/06 / Trace-and-profil-fonction-appels-with-gcc /

qui utilise addr2line de Binutils à cette fin. Vérifiez si cela vous aide


1 commentaires

Parfois .. Il est vraiment utile de simplement imprimer des noms FN pour le débogage de l'exactitude