Débogage Lua
Lua fournit une bibliothèque de débogage pour créer des débogueurs personnalisés. Lua lui-même n'a pas de débogueur intégré, mais de nombreux développeurs ont partagé leur code de débogueur Lua.
La bibliothèque de débogage de Lua contient les fonctions suivantes :
| Non. | Metode & Deskripsi |
|---|---|
| 1. | debug(): Entre en mode interactif avec l'utilisateur, en exécutant chaque chaîne saisie par l'utilisateur. À l'aide de commandes simples et d'autres paramètres de débogage, l'utilisateur peut inspecter les variables globales et locales, modifier les valeurs des variables, évaluer des expressions, etc. |
| 2. | getfenv(object): Renvoie l'environnement de l'objet. |
| 3. | gethook(thread facultatif): Renvoie trois valeurs représentant les paramètres de hook du thread : la fonction de hook actuelle, le masque de hook actuel et le compteur de hooks actuel. |
| 4. | getinfo ([thread,] f [, what]): Renvoie une table contenant des informations sur une fonction. Vous pouvez fournir la fonction directement, ou utiliser un nombre f pour la représenter. Le nombre f représente la fonction au niveau correspondant de la pile d'appels en cours d'exécution sur le thread spécifié : le niveau 0 est la fonction actuelle (getinfo elle-même) ; le niveau 1 est la fonction qui a appelé getinfo (sauf s'il s'agit d'un appel terminal, qui ne compte pas dans la pile) ; et ainsi de suite. Si f est un nombre supérieur au nombre de fonctions actives, getinfo renvoie nil. |
| 5. | debug.getlocal ([thread,] f, local): Cette fonction renvoie le nom et la valeur de la variable locale d'indice local de la fonction au niveau f de la pile. Cette fonction est utilisée non seulement pour accéder aux variables locales définies explicitement, mais aussi aux paramètres formels, aux variables temporaires, etc. |
| 6. | getmetatable(value): Pousse sur la pile la métatable de la valeur pointée par l'index donné. Si l'index est invalide, ou si la valeur n'a pas de métatable, 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 pouvant servir à sauvegarder toute valeur Lua que le code C souhaite sauvegarder. |
| 8. | getupvalue (f, up) Cette fonction renvoie le nom et la valeur de la up-ième upvalue de la fonction f. Si la fonction n'a pas cette upvalue, elle renvoie nil. |
| 10. | sethook ([thread,] hook, mask [, count]): Définit une fonction comme fonction de hook. La chaîne mask et le nombre count déterminent quand le hook sera appelé. Le mask est une chaîne composée des caractères suivants, chacun avec sa signification :
|
| 11. | setlocal ([thread,] level, local, value): Cette fonction affecte value à la variable locale d'indice local de la fonction au niveau level de la pile. Si cette variable n'existe pas, la fonction renvoie nil. Si level est hors limites, elle lève une erreur. |
| 12. | setmetatable (value, table): Définit la métatable de value sur table (qui peut être nil). Renvoie value. |
| 13. | setupvalue (f, up, value): Cette fonction définit value comme la upvalue d'indice up de la fonction f. Si la fonction ne possède pas cette upvalue, elle renvoie nil ; sinon, elle renvoie le nom de cette upvalue. |
| 14. | traceback ([thread,] [message [, level]]): Si message est présent et n'est ni une chaîne ni nil, la fonction renvoie message directement sans rien faire d'autre. Sinon, elle renvoie les informations de traceback de la pile d'appels. La chaîne optionnelle message est ajoutée au début du traceback de pile. Le nombre optionnel level indique à partir de quel niveau de la pile commencer la remontée de trace (par défaut 1, c'est-à-dire là où traceback est appelée). |
Le tableau ci-dessus liste les fonctions de débogage que nous utilisons couramment. Ensuite, nous pouvons examiner quelques exemples simples :
Exemple
print(debug.traceback("Trace de pile"))
print(debug.getinfo(1))
print("Fin de la trace de pile")
return 10
end
myfunction ()
print(debug.getinfo(1))
L'exécution du code ci-dessus produit la sortie suivante :
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 debug. La fonction getinfo est utilisée pour renvoyer une table d'informations sur la fonction.
Un autre exemple
Nous avons souvent besoin de déboguer des variables locales à l'intérieur d'une fonction. Nous pouvons utiliser la fonction setupvalue pour définir ces variables locales. Un exemple est le suivant :
Exemple
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())
L'exécution du code ci-dessus produit la sortie suivante :
1 2 index 1 k = 1 index 2 n = 2 11
Dans l'exemple ci-dessus, le compteur s'incrémente de 1 à chaque appel. Dans l'exemple, nous avons utilisé la fonction getupvalue pour afficher l'état actuel de la variable locale. Nous pouvons définir la variable locale sur une nouvelle valeur. Dans l'exemple, avant l'affectation, la valeur de n est 2. En utilisant la fonction setupvalue, nous l'avons définie sur 10. Maintenant, nous appelons la fonction, et après exécution, la sortie est 11 au lieu de 3.
Types de débogage
- Débogage en ligne de commande
- Débogage GUI
Les débogueurs en ligne de commande incluent : RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.
Les débogueurs GUI incluent : SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.
Autres extensions