2009-12-28 6 views

Répondre

1

Je n'ai pas beaucoup utilisé gprof, mais à ma connaissance, ni les wait ni les processus fils par voir ne sont profilés.

Voir un exemple simple:

#include <stdlib.h> 
#include <unistd.h> 
#include <limits.h> 

void slow_function() 
{ 
    unsigned int i; 
    for (i = 0; i < UINT_MAX; i++); 
} 

void quick_function(pid_t child) 
{ 
    int status; 
    waitpid(child, &status, 0); 
    return; 
} 

int main(int argc, const char *argv[]) 
{ 
    pid_t child; 

    child = fork(); 
    if (child == 0) // child process 
    { 
     slow_function(); 
     exit(0); 
    } 
    else 
     quick_function(child); 

    return 0; 
} 

La sortie gprof en est (sur ma machine):

% cumulative self    self  total 
time seconds seconds calls Ts/call Ts/call name 
    0.00  0.00  0.00  1  0.00  0.00 quick_function 

Si vous voulez vraiment le profil Childs/fils, je vous suggère this comme point de départ.

1

Il semble qu'il existe une option pour consigner les processus forkés, this ibm article en parle un peu.

Le même article recommande d'essayer tprof, il est similaire à gprof utilisé, mais utilise différentes méthodes sous le capot qui pourraient donner une image plus précise pour les applications multiprocessus/multithreads.

1

gprof ne tient compte que du temps CPU réel dans votre processus. Ce qui fonctionne beaucoup mieux est quelque chose qui échantillonne la pile d'appels, et l'échantillonne sur horloge murale temps, pas de temps CPU. Bien sûr, les échantillons ne doivent pas être pris en attendant l'entrée de l'utilisateur (ou s'ils sont pris, ils doivent être éliminés). Certains profileurs peuvent faire tout cela, comme RotateRight/Zoom, ou vous pouvez utiliser pstack ou lsstack, but here's a simple way to do it.

Questions connexes