2009-04-07 7 views
2

J'essaie de comprendre comment implémenter un outil de couverture de code à l'aide de l'API de débogage Win32.Comment implémenter un outil de couverture de code à l'aide de l'API de débogage Win32

Je pensais utiliser le Win32 Debugging API pour lancer un processus en mode débogage - et suivre les instructions CPU qui ont été exécutées. Après avoir suivi toutes les instructions CPU, j'utiliserais alors le fichier map pour le mapper à quelles lignes de code source ont été exécutées. Si je comprends bien, il y aurait deux façons de savoir quelles instructions CPU ont été exécutées.

  1. serait de lancer le processus en mode débogage - définir tous les threads en mode étape simple et de laisser la note d'application de débogage toutes les instructions qui ont été exécutées

  2. Ce serait faire une approche plus intelligente où vous En savoir plus sur les instructions x86 et remplacer fondamentalement l'instruction de branchement suivante avec un point d'arrêt. Puis suivi des instructions delta entre les deux points d'arrêt.

Mise à jour - nouvelles approches suggérées inspirées par la réponse de Michael:

  1. Démarrer avec le fichier de la carte et insérer des points d'arrêt pour le début de chaque ligne et de laisser la cadre de débogage être notifié chaque fois qu'un point d'arrêt frappe. Commencez avec le fichier map - instrumentation binaire pour insérer un "hook" qui est appelé à l'entrée de chaque ligne source - en évitant le callback dans la structure du débogueur.

  2. En utilisant une technologie VM - tels que VMware pour savoir quelles instructions dans un processus particulier a été exécuté - Je ne comprends pas bien cette approche ...

Quelqu'un pourrait-il valider l'une des approches ci-dessus ou peut-être suggérer une alternative - veuillez noter que le cas d'utilisation est la couverture de code ligne par ligne et non le profilage de performance - nous devons donc savoir si chaque ligne de source unique est visitée.

Mon objectif principal (bien qu'aucun plan particulier ne soit en place ...) serait de créer un simple outil de couverture de code pour Delphi principalement.

Merci!

+0

L'utilisation de Visual Studio Profiler est hors de question? Il peut instrumentaliser vos binaires et fournir une couverture de code. –

+0

Merci - mais malheureusement hors de question pour une application Delphi ... :) –

Répondre

2

Une approche consiste à accrocher tous les appels api et les appels de fonction pour les comparer à des tables créées à partir de la source. Ainsi, vous découvrez ce qui est couvert.
Il y a beaucoup api pour crochetage, on est Trappola API hooking

+0

Je n'avais jamais entendu parler de Trappola. Ça a l'air très intéressant. – Mick

1

Cela pourrait fonctionner - chaque événement une seule étape va créer une exception et vous pouvez enregistrer l'adresse IP de votre succès dans la carte des lignes de code exécutées. Malheureusement, j'imagine que ce serait glacial lent. Ce serait incroyablement inefficace, car chaque ligne de code entraîne 1000 fois plus de travail, une exception étant générée, piégée, un message envoyé à votre débogueur, puis un aller-retour après avoir enregistré le hit. Il pourrait être préférable d'essayer de définir des points d'arrêt à la place pour chaque ligne couverte et de les effacer après avoir été frappés. Ce serait plus rapide, mais très probablement encore très lent.

Le problème principal est que vous essayez d'utiliser le débogueur en tant qu'outil de couverture de code pour lequel il n'est pas destiné. Une recherche rapide montre plusieurs outils de couverture de code pour Delphi sur Internet.

+0

Michael - merci pour votre contribution - oui je me rends compte que ce serait lent - mais à court d'instrumentation du code source ou du code objet généré je ne vois pas comment l'implémenter d'une autre manière. Comment pensez-vous que les outils commerciaux implémentent une couverture de code si ce n'est pas ainsi? Je cherche à réinventer une roue .. –

+0

Deux techniques que je connais sont l'instrumentation du code binaire lui-même ou l'exécution du programme sur une VM qui garde la trace. – Michael

1

Je suggère, au lieu de l'accrochage pour chaque ligne de code, vous pouvez aller pour chaque bloc. Ce que je veux dire pour accrocher un bloc de codes. Ce sera plus rapide et vous pourrez également obtenir le nombre de lignes du nombre de blocs.

Questions connexes