Débogage Lua (Débogage)
Lua fournit une bibliothèque de débogage pour fournir la fonction de création de notre gouverneur personnalisé. Lua lui-même n'a pas de gouverneur intégré, mais de nombreux développeurs ont partagé leur code de gouverneur Lua.
La bibliothèque de débogage de Lua contient les fonctions suivantes :
sethook ([thread,] hook, mask [, count]) :Numéro de série | Méthode et objectif |
---|---|
1. | debug() : Entrez une interaction utilisateur mode et exécuter chaque chaîne saisie par l'utilisateur. À l'aide de commandes simples et d'autres paramètres de débogage, les utilisateurs peuvent inspecter les variables globales et locales, modifier les valeurs des variables, évaluer certaines expressions, etc. |
2. | getfenv(object) : Renvoie la variable d'environnement de l'objet. |
3. | gethook(fil facultatif) : Renvoie trois valeurs représentant les paramètres du crochet de fil : Crochet actuel Fonction, masque de crochet actuel, nombre de crochets actuel |
4. | getinfo ([thread,] f [, quoi]) : Renvoie un tableau d'informations sur une fonction. Vous pouvez fournir la fonction directement ou utiliser un nombre f pour représenter la fonction. Le nombre f représente la fonction exécutée au niveau correspondant de la pile d'appels du thread spécifié : le niveau 0 représente la fonction actuelle (getinfo elle-même) représente la fonction qui appelle getinfo (sauf s'il s'agit d'un appel final, auquel cas) ; cela ne compte pas sur la pile, etc.) Si f est un nombre supérieur au nombre de fonctions actives, getinfo renvoie zéro. |
5. | debug.getlocal ([thread,] f, local) : Cette fonction renvoie sur le stack L'index de la fonction au niveau f est le nom et la valeur de la variable locale local. Cette fonction n'est pas seulement utilisée pour accéder à des variables locales explicitement définies, mais inclut également des paramètres formels, des variables temporaires, etc. |
6. | getmetatable(value) : Poussez la métatable de la valeur pointée par l'index donné sur la pile. Si l'index n'est pas valide ou s'il n'y a pas de métatable pour la valeur, la fonction renvoie 0 et ne pousse rien sur la pile. |
7. | getregistry() : Renvoie la table de registre, qui est une table prédéfinie. Peut être utilisée. pour enregistrer toute valeur Lua que le code C souhaite enregistrer. |
8. | getupvalue (f, up) Cette fonction renvoie la valeur supérieure supérieure de la fonction f nom et valeur. Si la fonction n’a pas cette valeur supérieure, nil est renvoyé. |
10. | Entrez une fonction comme fonction de hook. Le masque de chaîne et le nombre déterminent quand le hook sera appelé. Le masque est une chaîne composée des caractères suivants, chaque caractère a sa propre signification : <. >
|
11. | setlocal ([thread,] niveau, local, valeur) : Cette fonction attribue une valeur à la variable locale de la fonction de niveau sur la pile. S'il n'existe pas de variable de ce type, la fonction renvoie zéro. Si le niveau est hors limites, génère une erreur. |
12. | setmetatable (valeur, table) : Définir la métatable de la valeur sur table (peut être nulle ). Valeur de retour. |
13. | setupvalue (f, up, value) : Cette fonction définit la valeur sur la fonction f Le haut valeur. Si la fonction n'a pas cette valeur supérieure, elle renvoie nil. Sinon, elle renvoie le nom de la valeur supérieure. |
14. | traçage ([thread,] [message [, niveau]]) : Si le message a , et n'est pas une chaîne ou nil, la fonction renvoie le message directement sans aucun traitement. Sinon, il renvoie les informations de traçabilité de la pile d'appels. Le message de chaîne facultatif est ajouté au début du traçage de la pile. Le niveau numérique facultatif spécifie à quel niveau de la pile commencer le traçage (la valeur par défaut est 1 , c'est là que le traçage est appelé). |
Le tableau ci-dessus répertorie nos fonctions de débogage couramment utilisées. Nous pouvons ensuite examiner quelques exemples simples :
function myfunction () print(debug.traceback("Stack trace")) print(debug.getinfo(1)) print("Stack trace end") return 10 end myfunction () print(debug.getinfo(1))
Exécuter la sortie de code ci-dessus. le résultat est :
Stack trace stack traceback: test2.lua:2: in function 'myfunction' test2.lua:8: in main chunk [C]: ? table: 0054C6C8 Stack trace end
Dans l'exemple ci-dessus, nous avons utilisé les fonctions traceback et getinfo de la bibliothèque de débogage. La fonction getinfo est utilisée pour renvoyer un tableau d'informations sur les fonctions.
Un autre exemple
Nous avons souvent besoin de déboguer des variables locales au sein des fonctions. Nous pouvons utiliser la fonction getupvalue pour définir ces variables locales. L'exemple est le suivant :
function newCounter () local n = 0 local k = 0 return function () k = n n = n + 1 return n end end counter = newCounter () print(counter()) print(counter()) local i = 1 repeat name, val = debug.getupvalue(counter, i) if name then print ("index", i, name, "=", val) if(name == "n") then debug.setupvalue (counter,2,10) end i = i + 1 end -- if until not name print(counter())
Le résultat de l'exécution du code ci-dessus est :
1 2 index 1 k = 1 index 2 n = 2 11
Dans l'exemple ci-dessus, le compteur augmentera de 1 à chaque fois qu'il est appelé. Dans l'exemple, nous utilisons la fonction getupvalue pour afficher l'état actuel des variables locales. Nous pouvons définir des variables locales sur de nouvelles valeurs. Dans l'exemple, la valeur de n avant le réglage est 2 et la fonction setupvalue est utilisée pour la définir sur 10. Maintenant, nous appelons la fonction et la sortie après exécution est 11 au lieu de 3.
Type de débogage
Débogage de la ligne de commande
Débogage de l'interface graphique
Les débogueurs de ligne de commande incluent : RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.
Les débogueurs du monde graphique incluent : SciTE, Decoda, ZeroBrane Studio, akdebugger et luaedit.