Klaus
Nombre de messages : 12331 Age : 75 Localisation : Ile de France Date d'inscription : 29/12/2009
| Sujet: Une trace paramétrable en 100 % Panoramic Sam 16 Jan 2016 - 1:53 | |
| J'ai commencé un petit outil permettant de tracer l'exécution d'un source Panoramic en suivant l'état de certaines variables en mode pas à pas. Le petit programme posté ci-après est un début. Il ne tient pas encore compte des labels et des SUB, mais ça viendra. Pour le moment, je montre le principe, pour voir s'il y a un intérêt. Voici le code: - Code:
-
' build_debug_version.bas
' Ce programme prend en entrée un fichier x.BAS et le transforme en ' un fichier debug_x.bas, x étant le nom du fichier source. Ce fichier ' généré peut ensuite être exécuté par Panoramic.exe. Si ce programme ' est appelé en mode commande, le nom et chemin du fichier source est ' pris par le premier paramètre. Si ce paramètre manque ou est invalide, ' le programme ouvre un dialogie d'ouverture de fichiers. ' ' Un deuxième paramètre en entrée désigne un fichier x.VAR qui contient ' la liste des noms de variables à tracer, à chaque pas d'exécution. Il ' faut spécifier un nom de variable par ligne, pas de tableau indicé. ' Si ce paramètre manque, le programme ouvre un dialogie d'ouverture de fichiers. ' ' Un troisième paramètre en entrée désigne le programme d'exécution de ' Panoramic (Panoramic.exe) avec son chemin d'accès. Si ce paramètre manque, ' le programme ouvre un dialogie d'ouverture de fichiers. ' ' Chaque ligne source sera remplacée par un appel à une sub debug(lig%), ' avec le code source de la ligne en commentaire, pour la lisibilité. ' La procédure debug commence par créer une form avec un mémo recevant la ' trace de l'exécution, si ces objets n'eistent pas encore. Donc, ceci ' se fait automatiquement, au premier appel (à la première ligne du code). ' Ensuite, cette sub va logger le numéro e ligne et le code source de ' cette ligne, puis appeler une procédure debug_variables. Cette procédure ' contient une ligne par variable à suivre. Cette ligne place le contenu ' de la variable dans la trace, si la variable est définie. ' ' La version actuelle sait gérer: ' - des lignes normales ' - des lignes miltiples ' - des lignes vides ' - les commentaires ' - la commande terminate ' - des labels (et goto/gosub/on_xxx) ' A venir: ' - SUB
dim bas$, var$, i%, s$, p%, s1$, exe$, direxe$, dirdef$ dirdef$ = dir_current$ + "\"
' ===== vérifier ou choisir le fichier source d'origine if param_number=0 open_dialog 11 : filter 11,"Source Panoramic (*.bas)|*.bas" bas$ = file_name$(11) delete 11 if bas$="_" then terminate else bas$ = trim$(param_value$(1)) if bas$="" then terminate end_if if lower$(right$(bas$,4))<>".bas" then message "Extension invalide" : terminate if file_exists(bas$)=0 then message "Fichier source non trouvé" : terminate
' ===== vérifier ou choisir le fichier de la liste des variables if param_number<2 open_dialog 11 : filter 11,"Liste de variables (*.var)|*.var" var$ = file_name$(11) delete 11 if var$="_" then terminate else var$ = trim$(param_value$(2)) if var$="" then terminate end_if if lower$(right$(var$,4))<>".var" then message "Extension invalide" : terminate if file_exists(var$)=0 then message "Fichier variables non trouvé" : terminate
' ===== charger le fichier source d'origine dlist 1 : ' fichier source en entrée file_load 1,bas$ if count(1)=0 then message "Fichier source vide" : ' terminate
' ===== générer le début du fichier source debug, avec le code d'origine modifié dlist 2 : ' fichier source debug généré for i%=1 to count(1) s$ = trim$(item_read$(1,i%)) if right$(s$,1)=":" if instr(s$," ")=0 item_add 2,s$ s$ = " label <"+s$+">" end_if end_if item_add 2,"debug("+str$(i%)+") : ' "+s$ if instr(lower$(s$),"terminate")>0 then item_add 2,"terminate" next i% item_add 2,"message "+chr$(34)+"Oups... programme pas terminé"+chr$(34)+" : terminate" item_add 2,""
dlist 3 file_load 3,var$
' ===== générer la procédure de debug pour chaque ligne item_add 2,"sub debug(lig%)" item_add 2," if variable("+chr$(34)+"KGF_debug%"+chr$(34)+")=0" item_add 2," dim KGF_debug%" item_add 2," for KGF_debug%=9000 to 10000" item_add 2," if (object_exists(KGF_debug%)=0) and (object_exists(KGF_debug%+1)=0) and (object_exists(KGF_debug%+2)=0) then exit_for" item_add 2," next KGF_debug%" item_add 2," form KGF_debug% : width KGF_debug%,300 : height KGF_debug%,screen_x : left KGF_debug%,screen_y-300" item_add 2," memo KGF_debug%+1 : parent KGF_debug%+1,KGF_debug% : full_space KGF_debug%+1 : bar_both KGF_debug%+1" item_add 2," dlist KGF_debug%+2 : file_load KGF_debug%+2,"+chr$(34)+"KGF_debug.bas"+chr$(34) item_add 2," end_if" item_add 2," item_add KGF_debug%+1,"+chr$(34)+" "+chr$(34) item_add 2," item_add KGF_debug%+1,str$(lig%)+"+chr$(34)+": "+chr$(34)+"+item_read$(KGF_debug%+2,lig%)" item_add 2," debug_variables()" item_add 2," select lig%" for i%=1 to count(1) s$ = trim$(item_read$(1,i%)) if right$(s$,1)=":" if instr(s$," ")=0 s$ = "' "+s$ end_if end_if if instr(lower$(s$),"terminate")>0 s1$ = s$ s$ = "" if p%>1 then s$ = left$(s1$,p%-1) s$ = s$ + "message "+chr$(34)+"<terminate>"+chr$(34) if len(s1$)>(p%+9) then s$ = s$ + mid$(s1$,p%+9,len(s1$)) end_if if s$="" then s$ = "'" item_add 2," case "+str$(i%)+": "+s$ next i%
item_add 2," end_select" item_add 2,"end_sub"
' ===== générer la procédure de traçage des variables, en fonction du fichier de liste des variables item_add 2,"sub debug_variables()" if count(3)>0 for i%=1 to count(3) s$ = item_read$(3,i%) if right$(s$,1)="$" item_add 2,"if variable("+chr$(34)+s$+chr$(34)+")=1 then item_add KGF_debug%+1,"+chr$(34)+" "+s$+"="+chr$(34)+"+"+s$ else item_add 2,"if variable("+chr$(34)+s$+chr$(34)+")=1 then item_add KGF_debug%+1,"+chr$(34)+" "+s$+"="+chr$(34)+"+str$("+s$+")" end_if next i% end_if item_add 2,"end_sub"
' ===== afficher le source généré dans un mémo memo 10 : full_space 10 : bar_both 10 file_save 2,"x.txt" file_load 10,"x.txt" file_delete x.txt ' ===== générer le fichier source version debug et le fichier de commande dir_change dirdef$ file_save 2,dirdef$+"KGF_debug.bas"
direxe$ = file_extract_path$(exe$) file_open_write 1,"KGF_debug.bat" file_writeln 1," "+chr$(34)+exe$+chr$(34)+" "+chr$(34)+direxe$+"KGF_debug.bas"+chr$(34)+" " file_writeln 1,"pause" file_close 1
' ===== lancer l'exécuteur de Panoramic if message_confirmation_yes_no("Exécuter ?")<>1 then end if param_number<3 open_dialog 11 : filter 11,"Exécuteur Panoramic|*.exe" exe$ = file_name$(11) delete 11 if exe$="_" then terminate else exe$ = trim$(param_value$(3)) if exe$="" then terminate end_if if lower$(right$(exe$,4))<>".exe" then message "Extension invalide" : terminate if file_exists(exe$)=0 then message "Exécuteur Panoramic non trouvé" : terminate execute "KGF_debug.bat" end
Un petit programme d'essai (test_debug.bas): - Code:
-
label boucle dim x%, a$ message "a" x% = 17 message "b" a$ = "coucou" message "c" boucle: a$ = message_input$("nouvelle valeur","A$:","") if a$<>"stop" then goto boucle terminate Et un fichier contenant la liste des variables à afficher à chaque itération (test_debug.var): - Code:
-
x% a$ Le programme à test_debug.bas n'a pas de vraie utilité, il ne sert qu'à montrer le principe. On peut lancer le programme build_debug_version.bas directement à partir de l'éditeur Panoramic. Les fichiers test_debug.bas et test_debug.var doivent être enregistrés sur disque. Le programme fait la conversion, affiche le source résultant dans un mémo, puis demande confirmation pour l'exécution. Dans l'affirmative, celle-ci est lancée via un fichier *.BAT généré pour l'occasion. | |
|