2010-06-02 7 views
5

J'ai un programme que je veux profiler avec gprof. Le problème (apparemment) est qu'il utilise des sockets. Alors je faire avancer les choses comme ceci:Utilisation de gprof avec des sockets

::select(): Interrupted system call 

je frappe ce problème un certain temps, a donné, et évolué. Mais j'aimerais vraiment pouvoir profiler mon code, en utilisant gprof si possible. Que puis-je faire? Y at-il une option gprof qui me manque? Une option de socket? Gprof est totalement inutile en présence de ces types d'appels système? Si oui, existe-t-il une alternative viable?

EDIT: Plate-forme:

  • Linux 2.6 (x64)
  • GCC 4.4.1
  • gprof 2,19
+0

Je pense que vous devriez aussi mentionner votre plate-forme: système d'exploitation, compilateur, la version gprof etc. –

+2

j'ai trouvé cet article: peut-être qu'il est d'une certaine utilité: http://unix.derkeiler.com/Newsgroups/comp.unix .programmer/2004-03/0938.html – LoudNPossiblyWrong

+0

Avez-vous essayé d'utiliser valgrind/kcachegrind pour profiler? Je le préfère à gprof. –

Répondre

5

Le code socket doit gérer système interrompu les appels quel que soit le profileur, mais sous profiler c'est inévitable. Cela signifie avoir du code comme.

if (errno == EINTR) { ... 

après chaque appel système. Par exemple, here pour l'arrière-plan.

+0

Super, merci. Suivi: http://stackoverflow.com/questions/2958114/handling-eintr-with-goto –

1

gprof (here's the paper) est fiable, mais il only was ever intended to measure changes, et même pour cela, il ne mesure que les problèmes de CPU lié. Il n'a jamais été annoncé pour être utile pour localiser des problèmes. C'est une idée que d'autres personnes ont superposée.

Envisager this method.

Une autre bonne option, si cela ne vous dérange pas de dépenser de l'argent, est Zoom.

Ajouté: Si je peux juste vous donner un exemple. Supposons que vous ayez une hiérarchie d'appels où Main appelle A un certain nombre de fois, A appelle B un certain nombre de fois, B appelle C un certain nombre de fois et C attend quelques E/S avec un socket ou un fichier, le programme fait. Supposons maintenant que le nombre de fois que chaque routine appelle le suivant est de 25% plus de temps que nécessaire. Puisque 1,25^3 est d'environ 2, cela signifie que le programme entier prend deux fois plus de temps que nécessaire pour fonctionner. En premier lieu, puisque tout le temps est passé à attendre l'E/S gprof ne vous dira rien sur la façon dont ce temps est passé, car il ne regarde que le temps "en cours d'exécution".

Deuxièmement, supposons (juste pour l'argument) compter le temps d'E/S. Il pourrait vous donner un graphique d'appel, en disant essentiellement que chaque routine prend 100% du temps. Qu'est-ce que cela vous dit? Rien de plus que vous ne le savez déjà.

Cependant, si vous prenez un petit nombre d'échantillons de pile, vous verrez sur chacun d'eux les lignes de code où chaque routine appelle le suivant. En d'autres termes, il ne s'agit pas simplement de vous donner une estimation approximative du temps en pourcentage, c'est que vous pointez sur des lignes de code spécifiques qui sont coûteuses. Vous pouvez regarder chaque ligne de code et demander s'il y a un moyen de le faire moins de fois. En supposant que vous faites cela, vous obtiendrez le facteur de 2 accélération.

Les gens obtiennent de gros facteurs de cette façon. Dans mon expérience, le nombre de niveaux d'appel peut facilement être de 30 ou plus. Chaque appel semble nécessaire, jusqu'à ce que vous demandiez si cela peut être évité. Même un petit nombre d'appels évitables peut avoir un effet énorme sur ces nombreuses couches.

Questions connexes