Cet article propose des conseils sur comment on débogue des programmes écrits en langage Small Basic. Cet article montre également quelques exemples réels pour déboguer les programmes publiés. Ce document s'appliquent aux versions de programmes suivant:

  • Small Basic v1.0 / v1.1
  • Visual Studio 2010 Express
  • Visual Studio Express 2013

Affichage du Contenu des Variables

Lorsque vous trouvez un comportement incorrect dans votre programme, comment en trouver la cause ? L'EDI (Environnement de Développement Intégré) Small Basic n'a pas de capacité comme inspecter une variable. Mais dans beaucoup de cas, quelques variables contiennent des valeurs inattendues. Pour les trouver, ajoutons quelques TextWindow.Write() ou TextWindow.WriteLine() pour regarder dans nos variables pour le débogage.

Pour afficher un tableau "arry", vous pouvez simplement utiliser TextWindow.WriteLine(arry) ou écrire un code l'exemple suivant:

TextWindow.ForegroundColor = "Yellow"
num = Array.GetItemCount(arry)
index = Array.GetAllIndices(arry)
For i = 1 To num
  TextWindow.WriteLine("arry[" + index[i] + "]=" + arry[index[i]])
EndFor
TextWindow.ForegroundColor = "Gray"

Pour le débogage des programmes basés sur du texte, changer la couleur du texte peut vous aider à distinguer l'affichage des informations de votre programme et les messages de débogage.

Pour afficher de petites valeurs pour le débogage, vous pouvez également utiliser TextWindow.Title, GraphicsWindow.Title ou GraphicsWindow.ShowMessage().

Ecrire du Code de Débogage comme "If debug Then..."

Si avez écrit une sous-routine pour afficher quelque chose comme un tableau pour le débogage, ce code pourra être utile dans le futur. Seulement ce code ne sera nécessaire que lorsque vous déboguerez. Donc une bonne technique est d'utiliser un indicateur de débogage que l'on met à On ou à Off pour vos routines de débogage.

Maze 0.4 (PNC833-0) est un exemple qui utilise un indicateur de débogage. La ligne suivante définit l'indicateur de débogage à "Off". Et debug = "True" met à "On" le débogage.

27.debug = "False"

Les lignes suivantes appellent une sous-routine pour afficher le tableau "cell" du labyrinthe créé en texte.

61.If debug Then
62.  DumpMaze()
63.  TextWindow.WriteLine(title)
64.EndIf

Les lignes suivantes ralentissent la création du labyrinthe pour voir les variables et mettre en pause le programme en utilisant TextWindow.Read().

229.     If debug Then
230.       Program.Delay(20)
231.     EndIf
232.     ' 2. Add the neighboring walls of the cell to the wall list.
234.     AddWallToList()
235.     If debug Then
236.       TextWindow.WriteLine("iWalls=" + iWalls)
237.       TextWindow.Write("nWalls=" + nWalls)
238.       TextWindow.Read()
239.     EndIf

Après que le débogage soit terminé, ces lignes peuvent être facilement trouvées (avec [Ctrl]+F dans l'EDI Small Basic) et supprimées. Actuellement ces routines sont supprimées dans Maze 0.5 (non publié).

Ecrire des Programmes de Test pour les Sous-Routines

Ecrire des sous-routines génériques (pour une utilisation généraliste) vous aideras dans votre productivité. Dans le cas Nonki (auteur de l'article original), quelques sous-routines pour les couleurs, mathématiques, souris etc. sont réutilisées dans plusieurs programmes. Mais les sous-routines génériques doivent être correctement testé et ne doivent pas avoir de bugs. Aucun (ou moins de) bugs doivent être une condition préalable à la productivité.

Pour tester vos sous-routines, c'est une méthode raisonnable d'écrire un programme de test pour elles. Un bon programme de test trouvera les bugs de vos sous-routines et rendra plus facile la détection des régressions après de débogage.

Un programme qui calcul une combinaison nCr pour un nombre long n (CPQ608) possède une routine de test TestDiv() pour une sous-routine générique Div().

Les paramètres suivants peuvent être trouvés avec TestDiv() et provoque un problème dans Div().

'a = "434399216531770650390143258708"
'b = "6752306690329"
'a = "397896921587794748049229269710"
'b = "8642083658481"

Ecrire une Liste de Bugs

La liste suivante a été écrite lorsque Shapes 1.1 (TLW744) était en débogage. Lorsque vous écrivez beaucoup de code, vous serez amener à rencontrer de nombreux comportements étranges dans votre programme. Dans ce cas, il vous sera utile d'écrire une liste qui inclus chaque phénomène. Car il peut y avoir différentes causes pour un même phénomène. Ensuite après le débogage, cette liste deviendra un bon jeu de test pour votre programme.
(NdT: cette liste étant données pour exemple, elle ne sera pas traduite)

  • CalcOpposite() returns wrong value when shape re-sizing
    cause: variable func was not be set for the routine
  • Pinches (small circles) remain after click out of shapes
    cause: not implemented yet
  • Frame sometimes not appear when shape moving
    cause: variable i didn't set as selectedshape
  • Pinches sometimes remain when cut and paste
    cause: duplicate as follows
  • Pinches don't redraw after copy
    cause: pinches are not displayed after paste
  • Shape moves after mouse release
    cause: needed to keep mouse released in mouse handler
  • Other shape size and position become wrong after color change
    cause: unnecessary RegisterShapeData() called and broke variable i
  • Other shape selected after adding ellipse or triangle
    cause: cancel adding procedure (when menu item clicked) set needless variable obj
  • Sometimes shape can't be moved
    cause: mouse released flag should be cleared

Signification des Messages d'Erreur

il y a deux types de messages d'erreur émis par Small Basic. Les premiers sont les erreurs de compilation. Quand aux autres il s'agit des erreurs d'exécution. Ces messages vous aide dans votre développement.

Les erreurs de compilation apparaissent sous le code source juste après que le bouton "Exécuter" soit cliqué et que votre programme contient des erreurs de syntaxe. L'image suivante montre des erreurs du programme "Fifty" (BRQ733) :

Désolé, nous avons trouvé quelques erreurs...
11,28: La variable 'files' est utilisée, mais aucune valeur ne lui est assignée. Etes-vous sûre de l'avoir correctement écrite ?
29,24: La variable 'buf' est utilisée, mais aucune valeur ne lui est assignée. Etes-vous sûre de l'avoir correctement écrite ?
 

Les nombres indiquent les ligne et colonne dans le code source, et vous pouvez vous rendre à ce point du code source du programme en double-cliquant sur le message d'erreur. Ce type de messages d'erreur de compilation indiquent ce qu'il se passe ainsi que des conseils pour les corriger. Dans notre cas, les erreurs apparaissent car les lignes avec File.GetFiles(path) et File.ReadContents(filename) ont été automatiquement commentées par le Serveur Small Basic.

En revanche, une erreur d'exécution apparaît lorsqu'un programme s'exécute mais rencontre un problème qui pousse le programme à s'arrêter. L'image suivante montre un exemple de message d'erreur d'un division par 0.

La valeur est trop grande ou trop petite pour un Decimal.
à System.Decimal..ctor(Double value)
à System.Decimal.op_Explicit(Double value)
à Microsoft.SmallBasic.Library.Math.Remainder(Primitive dividend, Primitive divisor)
à _SmallBasicProgram._Main()
 

La liste affiche dans une zone de texte ce qu'on appelle pile d'appel. Cette liste vous affiche les relations entre les sous-routines qui appelle et celle qui provoque l'erreur. Dans ce cas, la pile d'appel montre que le programme principal appelle Math.Remainder() qui provoque l'erreur.

 

Utiliser "Promouvoir" et le Débogueur Visual Studio

Malgré l'écriture de plusieurs routines de débogage, certains bugs peuvent trop compliqué pour en trouver les causes. Comme dernière option, il est nécessaire d'utiliser le bouton "Promouvoir" pour convertir le programme Small Basic en programme Visual Basic. Cela vous permettra d'utiliser le puissant débogueur de Visual Studio pour trouver les causes des bugs à l'origine dans votre programme Small Basic.

Etape 1: Installer Visual Basic 2010 Express si vous ne l'avez pas déjà installé.
Etape 2: Cliquer sur le bouton "Promouvoir" et saisir le nom du dossier pour le programme Visual Basic converti.
Etape 3: Cliquer sur les boutons [Suivant] ou [Terminer] dans l'assistant de conversion Visual Studio. Le programme XXX.sb (ou XXX.smallbasic) sera converti en XXXModule.vb.
Etape 4: Sélectionner [PROJET] [Ajouter une Référence] [Parcurir] SmallBasicLibrary.dll [Ajouter] [OK].
Etape 5: Réécrire 'For i = 1 To n' en 'For XXXModule.i = 1 To n' pour éviter les erreurs de portée.
Etape 6: Double-cliquer une ligne du code source pour y mettre un point d'arrêt si nécessaire. 
Etape 7: Cliquer sur le bouton "Démarrer le Débogage" ou la touche [F5] pour démarrer le programme.
Etape 8: Si le programme s'arrête sur le point d'arrêt, cliquer sur "Pas à pas détaillé (F8)" ou "Pas à pas principal (Shift+F8)" pour continuer.
Etape 9: Regarder dans l'onglet "Automatique", "Variables Locales" ou "Espion" et vérifier les valeurs de vos variables.
Etape 10: Si vous trouvez un bug, cliquer sur "Arrêter le débogage" et réécrire votre programme avec des commentaires.
Etape 11: Répéter depuis l'étape 6.

Si vous avez confirmé une solution de bug, retournez dans l'EDI Small Basic et corrigez le programme comme vous l'avez fait dans Visual Studio.

Il y a quelques différences entre la syntaxe du Small Basic et celle du Visual Basic, qui sont les suivantes:

  • Tableau : La notation des tableaux est arry[i][j] en Small Basic mais arry(i)(j) en Visual Basic.
  • Type de variable : les variables Small Basic se de type Primitive donc parfois il est nécessaire de de faire une conversion de type comme 'If ans = CType("", Primitive) Then'.
  • Booléen : Le type Primitive peut être utilisé comme booléen comme ceci:
    clicked = true ' or false
    If clicked Then
    If clicked = CType(false, Primitive) Then
  • Tableau: Définir un tableau à deux dimensions ne fonctionne pas en Visual Basic. Remplacer donc 'shape(5)("angle") = 90' comme ceci:
    saved = shape(5)
    saved("angle") = 90
    shape(5) = saved
  • Variable de boucle For: La variable de contrôle de la boucle For provoquera une alerte à cause de sa portée. Pour éviter ceci, ajouter le nom du module avant la variable: (Nous n'avons pas besoin de modifier les variables dans un bloc. C'est uniquement pour l'instruction For)
    Avant: For i = 1 To 10
    Après: For FooModule.i = 1 To 10

Conclusion

Ces conseils sont issus d'années de programmation en Small Basic mais il n'y a pas tout. Il est important d'être créatif avec la programmation et le débogage. Si vous trouvez une bonne méthode, veuillez l'ajouter dans cet article. Le Small Basic est vraiment compact et est un bon langage pour apprendre programmer. Il est facile et puissant.


Ressources Complémentaires

Voir Aussi

Autres Langues