2009-09-03 8 views
4

sur une machine Linux, j'utilise ptrace avec le paramètre PTRACE_SINGLESTEP pour compter le nombre d'instructions machine d'un programme. J'ai suivi cet article: http://www.ncsu.edu/it/mirror/ldp/LDP/LGNET/81/sandeep.html.Comptage des instructions machine d'un processus utilisant PTRACE_SINGLESTEP

Cependant, le résultat me semble étrange. Pour un programme très simple, plus de 95 000 instructions de machine sont comptées. Le programme de test est

int main(void) { return 23; } 

Que se passe-t-il ici? Le code de l'article est-il faux? (Je ne vois pas ce qui ne va pas.) Si ce n'est pas le cas, pourquoi un programme si simple nécessite-t-il plus de 95 000 instructions?

+2

Essayez de lier statiquement votre programme pour éviter le temps d'exécution de l'éditeur de liens dynamique. – mark4o

+0

Article lien cassé ... – Thilo

Répondre

5

Le programme C que vous compilez est lié à la bibliothèque C. Il contient le symbole _start à partir duquel l'exécution du programme commence. À ce stade, la bibliothèque C s'initialise et appelle finalement main. Après main renvoie, le contrôle retourne à _start et il existe un tas d'autres instructions pour exécuter et renvoyer la valeur de retour du programme. Notez qu'utiliser PTRACE_SINGLESTEP successivement ne compte pas le nombre d'instructions compilées. Il compte le nombre de instructions exécutées. Cela signifie que 95k instructions sont exécutées avant d'entrer main, lors de l'exécution main et après avoir quitté main.

1

Cela est dû à quelque chose appelé "logiciel bloat". Vous devez initialiser et finaliser stdio, et peut-être même un code de thread qui a saigné dans le runtime C standard. Si vous lisez un peu plus loin et le profil, vous pouvez savoir exactement quoi. Ou vous pourriez juste lire la source.

Mise à jour: En fait, j'ai réalisé plus tard que vous avez probablement suivi le fonctionnement de l'éditeur de liens dynamiques, ce qui a beaucoup de travail à faire. Je vois que quelqu'un a laissé un tel commentaire, alors j'ai upvoted le commentaire. Si vous n'avez pas lié le programme de manière statique, alors nos deux réponses initiales étaient fondamentalement erronées.

Questions connexes