Télécharger




Recherche :

Les bénéfices du « débogage inverse » avec ReplayEngine (TotalView)

Lors d’une session de débogage, il n’y a rien de plus pénible que d’arriver au plantage et de ne plus avoir accès aux variables locales ni même à la pile d’appels. Que faire dans ces cas-là, si ce n’est recommencer l’opération en positionnant des points d’arrêts successifs qui devraient nous permettre de nous rapprocher au plus près du site du crash ?

Si seulement on pouvait remonter le temps, et revenir aux instructions précédentes… Eh bien, allons-y !

1. Activer ReplayEngine

D’abord, il s’agit de démarrer TotalView en prenant soin de cocher la case « Enable ReplayEngine » dans la fenêtre de paramétrage :

2. Préparer la session de débogage

Une fois le bouton OK pressé, le code est prêt à être exécuté au sein du débogueur TotalView :

3. Lancer la session de débogage

La session de débogage se démarre en pressant le bouton "Go". Comme aucun point d’arrêt n’a été positionné, le code va aller jusqu’au bout de son exécution :

4. Remonter le fil des événements

Comme le montre la capture d’écran précédente, le code s’est arrêté suite à un <Segmentation Violation>. Malheureusement, aucune information n’est exploitable : pas de pile d’appels (Stack Trace), pas de variables locales et aucune indication sur l’instruction en cause…

La prochaine étape est donc de revenir à l’instant précédent l’apparition du <Segmentation Violation>. Pour ce faire, il suffit de presser le bouton "Prev" :

5. Explorer le passé

Intéressant : TotalView (grâce à ReplayEngine) est revenu un cran en arrière et nous indique qu’avant le <Segmentation Violation>, le pointeur d’exécution se trouvait en ligne 58, dans la fonction FuncB. En d’autres termes, on a pu reprendre la main sur une session de débogage qui débouchait a priori sur une impasse.

Maintenant, il s’agit de revenir encore un peu plus en arrière afin de pouvoir examiner quelques variables. On positionne un point d’arrêt ligne 53 et on presse le bouton "GoBack" :

6. Que valait arraylength ?

Arrivé à la ligne 53, il est intéressant de connaître la valeur d’arraylength et de v. il suffit de double-cliquer sur chacune de ces expressions.

arraylength est un int qui vaut 100.

 

7. Que valait v ?

v est un tableau 1D de 20 int.

8. Positionner un Watchpoint

Il est désormais clair qu’on a commis l’erreur d’écrire au-delà des limites de v. Mais une question essentielle demeure : à quel moment dans le code arraylength prend-il la valeur 100 ? Pour y répondre, nous allons créer un « Watchpoint » sur arraylength et continuer le cours de l’exécution en marche arrière. Un « Watchpoint » est une action qui indique à TotalView de s’arrêter sur l’instruction qui va modifier la variable d’intérêt (ici, arraylength) :

9. Revenir automatiquement à la cause

On prend soin de supprimer le point d’arrêt, et on presse le bouton "GoBack"  pour que TotalView exécute le code en sens inverse, jusqu’à ce qu’arraylength soit modifié. Le résultat est le suivant :

10. Vérifier la cause

TotalView s’arrête à la ligne 61. arraylength a (volontairement !) été modifié à cet endroit, et il y a fort à parier qu’une petite correction soit bénéfique !

Web : www.roguewave.com

Demande d’évaluation : www.roguewave.com/evaluate.aspx


Proposer un tutoriel
Vous souhaitez partagez vos connaissances avec les membres de Programmez! Publiez vos tutoriels.

L'auteur
SebGR (Sébastien Grimonet)



De A à Z
Programmez.com - 2013 - Tous droits réservés
Développement - WEB - ASP - PHP - C++ - Delphi - Java - Magazines - Ressources - Forum - Télécharger - Video - Emploi - Campus - .Net - Tutoriels

Le présent site Web est édité par Go 02, Sarl inscrite au RCS de Paris sous le N° 411321366 et dont le siège social est au 21 rue de Fécamp 75012 Paris.
Adresse de courrier électronique :diff@programmez.com

Le directeur de la publication du site www.programmez.com est Jean-Claude Vaudecrane en qualité de gérant de la sarl GO 02

Le portail du décideur informatique en entreprise : Solutions & Logiciels