Cours VB.NETDate de mise à jour : 05/12/2010
XII. Débogage
XII-A. Débogage (rechercher les 'Bugs')
XII-B. Suspendre l'exécution en vb 2008
XII-C. Débogage pas à pas en vb 2008
XII-C-1. Comment voir rapidement la valeur des propriétés ou de variables ?
XII-C-2. Modification du code source
XII-D. Débogage en vb 2010
XII-E. Sortie des informations de débogage
XII-E-1. Objet Console
XII-E-2. Objet Debug
XII-E-3. Trace
XII-E-4. Mode 'Trace', 'Release', 'Debug'
XII-F. Comprendre les 'Messages d'erreur'
XII-F-1. Instance d'objet
XII-F-2. Membre absent
XII-F-3. Type Attendu
XII-F-4. Identificateur attendu
XII. Débogage
XII-A. Débogage (rechercher les 'Bugs')
Le débogage est la recherche des bugs, les erreurs de logique.(voir Traiter les erreurs)
Rappelons qu'il existe:
- Les erreurs de syntaxe.
- Les erreurs de logique.
- Les erreurs d'exécution.
Les erreurs de syntaxe sont détectées automatiquement par l'éditeur de Visual Studio. ou lors de la génération du projet en mode Run. La compilation vérifie les types des données, les paramètres....
Les erreurs d'exécution surviennent lorsque l'exécution d'une instruction échoue ( tentative d'ouverture d'un fichier qui n'existe pas par exemple). Cela provoque l'apparition d'un message et provoque l'arrêt brutal de l'application. Il faut donc prévoir une gestion des éventuelles erreurs d'exécution afin d'éviter l'arrêt de l'application. A l'aide de Try Catch, on pourra intercepter l'erreur et informer l'utilisateur, prévoir une correction.
Les erreurs de logique sont plus difficiles à détecter. Le code est syntaxiquement correct, mais il ne réalise pas les opérations prévues. C'est là qu'intervient le débogage afin de diagnostiquer l'origine de l'erreur.
Pour déboguer, il faut lancer l'exécution du programme puis,
- Suspendre l'exécution à certains endroits du code
- Voir ce qui se passe puis faire avancer le programme pas à pas.
- Afficher des informations de débogage quand le programme tourne.
XII-B. Suspendre l'exécution en vb 2008
En VB 2008, pour démarrer et arrêter l'exécution, on utilise les boutons suivants:
On lance le programme avec le premier bouton, on le suspend avec le second, on l'arrête définitivement avec le troisième..
On peut suspendre (l'arrêter temporairement) le programme:
- avec le second bouton
- grâce à des points d'arrêt (pour définir un point d'arrêt en mode de conception, cliquez en face d'une ligne dans la marge grise: la ligne est surlignée en marron. Quand le code est exécuté , il s'arrête sur cette ligne marron).
- en appuyant sur Ctrl-Alt-Pause
For i= 1 To 6
Tableau (i)= i* i
Next i
|
En plus si on clique sur le rond de gauche avec le bouton droit de la souris, on ouvre un menu permettant de modifier les propriétés de ce point d'arrêt (il y a la possibilité d'arrêter au premier ou au Xième passage sur le point d'arrêt, ou arrêter si une expression est à True ou à changé)
- en incluant dans le code une instruction Stop
 |
Attention: Si vous utilisez des instructions Stop dans votre programme, vous devez les supprimer avant de générer la version finale.
|
Les transformer en commentaire :
ou utiliser des instructions conditionnelles :
#If DEBUG Then
Stop
#End If
|
Dans ce cas, en mode Debug l'instruction Stop sera exécutée, pas en mode Release.
XII-C. Débogage pas à pas en vb 2008
Quand le programme est suspendu, on peut observer les variables, déplacer le point d'exécution, on peut aussi faire marcher le programme pas à pas (instruction par instruction) et observer l'évolution de la valeur des variables, on peut enfin modifier la valeur d'une variable afin de tester le logiciel avec cette valeur.
F11 permet l'exécution pas à pas, instruction par instruction (y compris des procédures appelées: si il y a appel à une autre procédure, le pas à pas saute dans l'autre procédure)
F10 permet le pas à pas (sans détailler les procédures appelées: exécute la procédure appelée en une fois)
Maj+F11 exécute jusqu'à la fin de la procédure en cours.
On peut afficher ou définir l'instruction suivante, exécuter jusqu'au curseur, insérer un point d'arrêt ou un espion en cliquant sur le bouton droit de la souris et en choisissant une ligne du menu (VB 2003).
Espion express (VB 2003 et 2005)permet de saisir une expression (variable, calcul de variables) et de voir ensuite dans une fenêtre 'espion' les modifications de cette expression au cours du déroulement du programme.
Exemple en VB 2005, c'est pareil en VB 2003: suivre la valeur de la variable de boucle 'i'.
Sur la ligne , bouton droit, 'espion express..' dans la fenêtre qui s'ouvre à droite,
Tapez 'i' puis 'Fermer', la fenêtre espion apparaît en bas avec la valeur de i
Tapez F10 , F10.. la boucle tourne et i est incrémenté.
Atteindre la définition permet d'afficher la déclaration de la variable et ainsi de voir quelle est sa portée et si elle est initialisée. S'il s'agit du nom d'une procédure, on se retrouve dans la procédure (pour voir ce qu'elle contient)
On peut grâce au menu 'Débogage' puis 'Fenêtre' ouvrir les fenêtres:
Automatique uniquement en VB 2003, qui affiche les valeurs des variables de l'instruction en cours et des instructions voisines.
Immédiat (VB 2003 2005) ou il est possible de taper des instructions ou expressions pour les exécuter ou voir des valeurs.
Taper "?I" (c'est l'équivalent de "Print I" qui veut dire: afficher la valeur de la variable I) puis valider, cela affiche la valeur de la variable I.
Autre exemple, pour voir le contenu d'un tableau A(), tapez sur une seule ligne: "For i=0 to 10: ?A(i): Next i"
Enfin, il est possible de modifier la valeur d'une variable: Taper" I=10" puis valider, cela modifie la valeur de la variable.
Espions permettant d'afficher le contenu de variables ou d'expressions.
Espions Express permet d'afficher la valeur de l'expression sélectionnée.
Points d'arrêts (VB 2003 et 2005) permet de modifier les propriétés des points d'arrêts. on peut mettre un point d'arrêt en cliquant dans la marge grise à gauche: l'instruction correspondante s'affiche en marron et l'exécution s'arrêtera sur cette ligne.
Me (VB 2003) affiche les données du module en cours.
Variables locales (VB 2003 et 2005)affiche les variables locales.
Modules (VB 2003 )affiche les dll ou .exe utilisés.
Mémoire, Pile d'appels, Thread, Registres, Code Machine permettent d'étudier le fonctionnement du programme à un niveau plus spécialisé et technique.
Toutes ces fenêtres ne sont pas disponibles dans les versions Express.
XII-C-1. Comment voir rapidement la valeur des propriétés ou de variables ?
Il est toujours possible de voir la valeur d'une propriété d'un objet en la sélectionnant avec la souris:
Exemple on sélectionne label1.Text et on voit apparaître sa valeur.
Pour les variables, il suffit que le curseur soit sur une variable pour voir la valeur de cette variable.
On peut aussi copier une expression dans la fenêtre 'immédiat' , mettre un ? avant et valider pour voir la valeur de l'expression.
Attention à l'affichage:
Parfois en mode pas à pas on regarde le résultat d'une instruction dans la fenêtre du programme. Par exemple on modifie la propriété text d'un label et on regarde si le label à bien changé. Parfois la mise à jour n'est pas effectuée car le programme met à jour certains contrôles seulement en fin de procédure. pour palier à cela et afficher au fur et à mesure, même si la procédure n'est pas terminée, on utilise la méthode Refresh de l'objet qui 'met à jour'.
Exemple:
Label1. text = " A "
Label1. Refresh
|
Cela ne semble pas toujours fonctionner. Avez-vous une explication?
XII-C-2. Modification du code source
En version 2003, les modifications effectuées lors de la suspension de l'exécution, ne sont pas prises en compte lors du redémarrage.
Depuis VB 2005 Il y a maintenant le 'Edit and continue': en mode Debug, on peut modifier une ligne et poursuivre le programme qui tiendra compte de la modification (Sauf pour les déclarations).
Depuis la version 2005, Il est proposé des solutions pour corriger les erreurs de code:
Une fenêtre vous indique les corrections à faire.
Si je veux afficher une valeur numérique (avec option Strict=On),il y a erreur, VB me propose la correction:
XII-D. Débogage en vb 2010
Vb propose des solutions pour corriger les erreurs de code:
Si je fais une erreur Vb la souligne en ondulé bleu, si je mets le curseur dessus il m'explique l'erreur:
S'il y a un soulignement rouge, mettre le curseur dessus affiche un bouton avec un point d'exclamation qui ouvre une fenêtre donnant la correction de l'erreur:
Si je lance le programme en mode 'Run' et qu'il y a des erreurs, Vb me le signale et répertorie les erreurs dans la liste des taches en bas.
Mode débogage (mode BREAK):
Une fois lancée l'exécution ( F5),on peut arreter temporairement l'exécution:
En tapant Ctrl +Pause
En cliquant sur  (visible lors de l'exécution).
En utilisant un point d'arrêt (Avant l'exécution ou en cours d'exécution,en cliquant dans la colonne grise avant la ligne de code, cela affiche un rond, un point d'arrêt).
En ajoutant une instruction STOP dans le code.
On peut modifier le code puis relancer l'exécution avec F5.
On peut voir la valeur d'une propriété d'un objet , d'une variable en le pointant avec la souris:
Il s'affiche un petit cadre donnant la valeur de la propriété d'un objet.
Si on clicke sur la punaise, l'affichage de la variable et de sa valeur devient permanent et la valeur est mise à jour.
Quand on clique sur une variable, cette variable est surlignée dans l'ensemble du code:
Il y a un menu déboguer:
F8 permet l'exécution pas à pas (y compris des procédures appelées).
MAJ F8 permet le pas à pas (sans détailler les procédures appelées).
CTRL+F10 pas à pas principal.
MAJ+F11 pas à pas sortant.
Espions permettant d'afficher le contenu de variables ou d'expressions.
Espions Express permet d'afficher la valeur de l'expression sélectionnée.
Si dans le code ,on clicke droit, s'ouvre un menu contextuel:
CTRL+F8 exécute jusqu'au curseur.
Alt+* afficher l'instruction suivante.
Toutes ces actions peuvent être effectuées par les menus, les raccourcis.
On peut aussi ajouter des boutons de déboguer dans la barre d'outils(menu 'Affichage', 'Barre d'outils', 'déboguer')
Le bouton 'variables locales'(CTRL+ALT+V puis L) affiche toutes les variables locales et leur valeur:
Le bouton immédiat ouvre une fenêtre qui permet de taper du code qui sera immédiatement exécuté.
(Ici on affiche la valeur de b avec '?b', on modifie sa valeur avec 'b=b+1')
Vb choisit automatiquement la configuration Debug (compilée avec des informations de débogage symboliques et aucune optimisation) lorsque vous cliquez sur Démarrer dans le menu Déboguer et la configuration Release ( ne contient pas d'informations de débogage relatives aux symboles et est entièrement optimisée) lorsque vous utilisez le menu Générer.
XII-E. Sortie des informations de débogage
On veut parfois afficher automatiquement des résultats intermédiaires, un message destiné au programmeur dans telle circonstance...quand le programme tourne.
XII-E-1. Objet Console
On peut écrire sur la fenêtre console, quand on a parfois besoin d'afficher des informations, mais uniquement pour le programmeur:
Console. WriteLine ( myKeys (i))
|
Mais dans un programme Windows, il n'y a pas de console!! la sortie est donc envoyée vers la fenêtre de sortie (voir Debug)(Menu Affichage>Autres fenêtres>Sortie pour voir la fenêtre)
Autre exemple:
Dim amis () As String = {" pierre " , " jean " , " jacques " , " toto " }
For Each nom As String In amis
Console. Out . WriteLine (nom)
Next
|
XII-E-2. Objet Debug
L'espace de noms Systems.Diagnostics est nécessaire.
Pour déboguer du code, on a parfois besoin d'afficher des informations, mais uniquement pour le programmeur, en mode debug afin de suivre le cheminement du programme ou la valeur d'une variable ou si une condition se réalise; pour cela on utilise une fenêtre nommée 'Sortie'(Output). (Menu Affichage>Autres fenêtres>Sortie)
Pour écrire dans la fenêtre Output (sans arrêter le programme):
et pour ajouter un passage à la ligne:
- Le contenu d'une variable:
- Les propriétés d'un objet:
Exemple:
Debug. Write (" ça marche " )
Dim A as Integer= 2
Debug. Write (A)
Debug. Write (A+ 2)
|
On voit que s'il y a une expression, elle est évaluée.
On peut aussi afficher un message si une condition est remplie en utilisant WriteLineIf ou WriteIf:
Debug. WriteLineIf (i = 2, " i=2 " )
|
Affiche 'i=2' si i=2
Cela vous permet, sans arrêter le programme (comme le fait Assert), d'être informé quand une condition est vérifiée.
Debug.Assert par contre affiche une fenêtre Windows et stoppe le programme si une assertion(une condition) passe à False.
Debub. Assert (Assertion)
Debub. Assert (Assertion, Message1)
Debub. Assert (Assertion, Message1, Message2)
|
L'exemple suivant vérifie si le paramètre 'type' est valide. Si le type passé est une référence null (Nothing dans Visual Basic), Assert ouvre une boite de dialogue nommé 'Echec Assertion' avec 3 boutons 'Abandonner, Recommencer' 'Ignorer'.. La liste des appels est affichée dans la fenêtre (procédure en cours en tête de liste, module et numéro de ligne en première ligne)
Public Shared Sub UneMethode (type As Type, Typedeux As Type)
Debug. Assert ( Not (type Is Nothing ), " Le paramètre Type est=Nothing " ,
_" Je ne peux pas utiliser un Nothing " )
. . . .
End Sub UneMethode
Debug. Fail
|
Fait pareil mais sans condition.
XII-E-3. Trace
Trace possède les mêmes fonctions que Debug (Write, WriteIf, Assert, Fail..) mais la différence est que Trace permet d'afficher à l'utilisateur final par défaut.
XII-E-4. Mode 'Trace', 'Release', 'Debug'
En VB 2003, en haut de la fenêtre de l'IDE il y a une liste déroulante elle contient:
Release. (à utiliser pour générer la version à distribuer)
Debug (à utiliser pour générer une version à tester)
En VB 2005, si vous choisissez les paramètres de développement Visual Basic, l'outil qui permet de choisir entre la configuration Debug et Release n'apparaît pas dans la barre d'outils. Visual Studio choisit automatiquement la configuration Debug lorsque vous cliquez sur Démarrer dans le menu Débogueur et la configuration Release lorsque vous utilisez le menu Générer
Trace est activé par défaut. Par conséquent, du code est généré pour toutes les méthodes Trace dans les versions release et debug. Ceci permet à un utilisateur final d'activer le traçage pour faciliter l'identification du problème sans que le programme ait à être recompilé.
Par opposition, Debug est désactivé par défaut dans les versions release, donc aucun code exécutable n'est généré pour les méthodes Debug.
On peut utiliser une constante nommé DEBUG qui aura la valeur True si on est en mode Debug.
Cela permet d'écrire:
#If Debug Then
Stop
#End If
|
Ici Stop se produira uniquement si on est en mode Debug; en mode Release, il n'y aura pas d'arrêt.
XII-F. Comprendre les 'Messages d'erreur'
Quand il y a une erreur de syntaxe, VB souligne l'erreur. Mettre le curseur sur l'erreur, un message d'erreur apparaît:
En VB 2005 un panneau d'exclamation permet d'ouvrir une fenêtre proposant le moyen de corriger l'erreur:
Ici on met dans la propriété text d'un label un Integer, alors qu'il faut mettre une String (Option Strict est probablement égal à On); Vb montre la correction : CStr(i) converti i en String.
Certains messages d'erreur, pour les débutants, sont parfois totalement incompréhensible!!
Voyons quelques messages très fréquents:
XII-F-1. Instance d'objet
"La référence d'objet n'est pas définie à une instance d'un objet".
La plupart du temps cela veut dire qu'on utilise un membre d'un Objet alors qu'on n'a pas instancié cet objet.
Il y a bien une Classe, mais pas d'objet instancié à partir de cette Classe, on veut utiliser un membre de la Classe alors qu'on ne peut utiliser un membre que sur une instance.
Exemple:
Dim bt As Button
bt. BringToFront ()
|
Il n'existe pas réellement d'objet Button : la référence d'objet (bt) n'est donc pas une instance.
Il aurait fallu écrire:
Dim bt As New Button
bt. BringToFront ()
|
XII-F-2. Membre absent
Texte n'est pas un membre de System.Windows.Forms.TextBox"
Parfois on fait une bête faute de frappe:
Il faut taper : text!!
D'autres fois, on se trompe sur la classe et instance.
TextBox1. IsNullOrEmpty donne le message:
|
"IsNullOrEmpty n'est pas un membre de System.Windows.Forms.TextBox"
On se trompe: on pense que IsNullOrEmpty est un membre de l'instance TextBox1, en fait c'est un membre de la classe String; il faut écrire:
If String . IsNullOrEmpty (TextBox1. Text )
|
XII-F-3. Type Attendu
"Type attendu"
Exemple:
Private MyVariable As New Obladioblada
|
Après As New VB attend un type (Integer , Short, String) ou un nom de classe (Form1..). Obladioblada n'est pas une classe (un type!!)
Exemple2:
Private ObjetDataSet As New dataset
|
dataset est souligné comme une erreur "type attendu"!!: Après New Vb attend un type d'objet, une classe, dataset n'est donc pas considéré comme une classe car il n'est pas reconnu: la Classe correspondante n'a pas été importée.
En fait dataset ne peut être utilisé que si Imports System.Data a été ajouté avant, dans ce cas Vb sait que c'est un type .
XII-F-4. Identificateur attendu
2 est surligné, si on met la souris sur le "2", le message 'Identificateur attendu' apparaît.
Erreur: un nom de variable ne doit pas commencer par un chiffre, Vb considère donc que '2a' n'est pas un identificateur (un nom de variable' valide).
Les sources présentés sur cette page sont libres de droits,
et vous pouvez les utiliser à votre convenance. Par contre cette page de présentation de ces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © .
Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu :
textes, documents, images, etc sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.
Cette page est déposée à la SACD.
|