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érieMé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.
La saisie d'une ligne contenant uniquement cont mettra fin à la fonction, permettant à l'appelant de continuer.

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é.
Les noms de variables commençant par '(' (crochets ouverts) représentent des variables sans nom (blocs de code avec informations de débogage supprimées).

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 :

<. >

  • '

    ' : Chaque fois que Lua appelle une fonction, appelez le hook c ;

  • 'r' : Chaque fois que Lua revient d'une fonction, appelez le hook

  • ' l' : Le hook est appelé à chaque fois que Lua entre dans une nouvelle ligne.

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.