2016-09-30 1 views
4

Je me demande s'il existe une API au sein de gprof pour activer et désactiver le profilage au moment de l'exécution par l'application surveillée. Je suis intéressé à désactiver le profilage de certaines parties du code et à lui permettre de se concentrer sur celles qui m'intéressent. Je veux dire, y a-t-il un moyen d'éviter cela?Activer et désactiver gprof lors de l'exécution?

int main (void) 
{ 

    // disable gprof ? 
    uninteresting_routine(); 
    // enable gprof ? 

    interesting_routine(); 
} 

Ce link du site du CCG se référant les options d'instrumentation ne semble pas inclure toute référence à cette fonctionnalité.

Répondre

2

Il existe une façon non documentée et cachée de faire cela qui fonctionne sur certains systèmes (au moins certaines, sinon toutes, les versions de la glibc et certains BSD).

$ cat foo.c 
extern void moncontrol(int); 

static void 
foo(void) 
{ 
} 

static void 
bar(void) 
{ 
} 

int 
main(int argc, char **argv) 
{ 
    moncontrol(0); 
    foo(); 
    moncontrol(1); 
    bar(); 
    return 0; 
} 
$ cc -o foo -pg foo.c && ./foo 
$ gprof foo | egrep 'foo|bar' 
    0.00  0.00  0.00  1  0.00  0.00 bar 
[1]  0.0 0.00 0.00  1   bar [1] 
    [1] bar 

Glibc n'a pas de prototype ou de page de manuel pour cette fonction, mais elle existe.

+0

Génial merci! Cela fonctionne également avec le compilateur Intel. Simplement la curiosité, vous rappelez-vous où avez-vous obtenu cette information? – Harald

+0

@Harald J'ai travaillé une fois sur le code de profilage dans un noyau et j'ai regardé comment notre libc faisait les choses. Quand j'en ai eu besoin sur Linux il y a 10 ans je m'en suis souvenu, vérifié et Linux a mis en place la même chose. – Art

+0

@Harald btw. Cela ne devrait pas du tout dépendre du compilateur puisque le compilateur utilise juste les hooks fournis par libc. – Art