2010-08-30 5 views
6

J'ai la question suivante et d'un point de vue systémique je veux savoir comment y parvenir facilement et efficacement. Étant donné qu'une tâche 'abc' qui a été construite avec des informations de débogage et une variable globale "TRACE" normalement définie sur 0, je voudrais imprimer dans le fichier 'log' l'adresse de chaque fonction appelée Je pensais faire cela par le biais d'une tâche de chargement frontal/cerclage de bottes que je développerais et qui se pencherait sur les instructions pour un modèle de saut commun./frame pointer push, en écrivant l'adresse puis en mappant les adresses aux noms de fonctions à partir des informations de débogage symboliques dans abc. Il pourrait y avoir de meilleurs moyens au niveau du système de faire cela sans un chargeur frontal, et je ne suis pas sûr de ce qui est le plus faisable.C/C++ Question sur les techniques de programmation de traces

Toutes les techniques mises en œuvre là-bas?

+3

profilers peut déjà le faire pour vous - même indiquant le nom de la fonction au lieu de l'adresse. Pourquoi ils ne travaillent pas pour vous? – Dummy00001

+0

Pourquoi l'adresse de la fonction vous intéresse-t-elle à la place de son nom? Aussi, il est utile de savoir quel système d'exploitation et compilateur vous utilisez. –

+0

J'utilise gcc/CC/xlC sur HP/Sun/IBM. Je suis finalement intéressé par le nom des fonctions; l'adresse ne devait être qu'un intermédiaire et peut être inutile. Merci. – BlueCollar

Répondre

1

Assurez-vous d'avoir examiné les identificateurs prédéfinis __func__ ou __FUNCTION__. Ils fournissent une chaîne littérale du nom de la fonction/méthode que vous exécutez actuellement.

3

Une possibilité est de prétraiter la source avant de la compiler. Ce prétraitement ajoute du code au début de chaque fonction qui vérifie le TRACE global et, s'il est défini, écrit dans le journal. Comme Mystagogue l'a dit, le compilateur a des macros de préprocesseur qui s'étendent au nom de la fonction.

Vous pouvez également consulter certains outils de profilage. Certains d'entre eux ont des fonctionnalités proches de ce que vous demandez. Par exemple, certains échantillonnent périodiquement la totalité de la pile d'appel, ce qui peut vous en dire beaucoup sur le flux de code sans enregistrer tous les appels.

+0

Les sources de prétraitement peuvent être l'une des façons les moins chères de le faire. – Dummy00001

+0

Nous devons nous connecter chaque appel. Je pourrais utiliser dtrace pour obtenir des piles périodiques de haute fréquence, mais cela ne va pas faire l'affaire.Les sources de prétraitement pourraient le faire, mais nos binaires atteignent déjà la limite de 4 Go de 32 bits. Merci – BlueCollar

2

La recherche d'un prologue/d'un épilogue commun ne fonctionnera pas en présence d'une omission de pointeur de trame et d'une optimisation d'appel arrière. En outre, les optimiseurs modernes aiment diviser les fonctions en plusieurs morceaux et fusionner des segments de queue communs de différentes fonctions.

Il n'existe pas de solution standard.

Pour le compilateur Microsoft, consultez _penter et _pexit. Pour GCC, regardez l'option -finstrument-functions et les amis.

De même, sur Windows x86, vous pouvez utiliser un moniteur tel que WinApiOverride32. Il est principalement destiné à surveiller les appels API DLL et système, mais vous pouvez également générer un fichier de description à partir du fichier map de votre application et surveiller également les fonctions internes.

(. Modifié: lien ajouté à l'option GCC)

+0

Je suis d'accord - merci pour les commentaires. Le débogueur 'dbx' semble être capable de faire cela, donc je ne pense pas qu'il y ait une optimisation de l'appel de queue - ou comment dbx pourrait-il le comprendre? Si le débogueur peut le faire, nous devrions pouvoir. Le problème est qu'il n'est évidemment pas pratique d'avoir ceci chargé dans dbx dans un environnement de production, donc l'idée était de faire le minimum de travail nécessaire dans une tâche similaire de chargement frontal qui peut dire quand les binaires appellent des fonctions. Même dans le pire des cas, je pourrais enregistrer tous les sauts, ce qui montrerait également (quoique bruyant) le flux intra-fonction. – BlueCollar

+0

Je suis plein d'espoir pour le -finstrument-fonctions :) va enquêter plus loin .. merci beaucoup – BlueCollar

Questions connexes