English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

调试(Debug) Lua

Lua propose une bibliothèque de débogage pour fournir la fonctionnalité de création de nos propres débogueurs. Lua n'a pas de débogueur intégré, mais de nombreux développeurs partagent leur code de débogueur Lua.

La bibliothèque debug de Lua contient les fonctions suivantes :

NuméroMéthode et usage
1.debug():

Entrer dans un mode d'interaction utilisateur, exécuter chaque chaîne d'entrée de l'utilisateur. Utilisant des commandes simples et d'autres réglages de débogage, l'utilisateur peut consulter les variables globales et locales, modifier les valeurs des variables, calculer des expressions, etc.
Insérer une ligne contenant uniquement le mot cont pour terminer cette fonction, de sorte que l'appelant puisse continuer à exécuter.

2.getfenv(object):

Renvoie les variables d'environnement de l'objet.

3.gethook(optional thread):

Renvoie trois valeurs représentant les réglages de l'hameçon de thread : la fonction hameçon actuelle, le masque hameçon actuel, le comptage hameçon actuel

4.getinfo ([thread,] f [, what]):

Renvoie un tableau contenant des informations sur une fonction. Vous pouvez fournir directement cette fonction, ou utiliser un nombre f pour représenter cette fonction. Le nombre f représente la fonction en cours d'exécution à la couche correspondante de la pile d'appels spécifiée : 0 couche représente la fonction actuelle (getinfo lui-même); 1 La couche représente la fonction appelante getinfo (sauf si c'est une appel en queue, dans ce cas, ce n'est pas compté dans le tas);etc. Si f est un nombre plus grand que le 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 de l'index local de la fonction à la couche f du tas. Cette fonction est utilisée non seulement pour accéder aux variables locales explicitement définies, mais aussi pour les arguments de forme, les variables temporaires, etc.

6.getmetatable(value):

Empile la table métamètre de la valeur pointée par l'index donné. Si l'index est invalide ou si cette valeur n'a pas de table métamètre, la fonction renvoie 0 et ne place rien sur la pile.

7.getregistry():

Renvoie le registre du tableau, un tableau prédefini que l'on peut utiliser pour sauvegarder toute valeur Lua que le code C souhaite sauvegarder.

8.getupvalue (f, up)

Cette fonction renvoie le nom et la valeur de la valeur de premier ordre f de la fonction f. Si cette fonction n'a pas cette valeur de premier ordre, elle renvoie nil.
Un nom de variable précédé de '(' (parenthèse ouverte) indique une variable sans nom (code de débogage supprimé).

10.sethook ([thread,] hook, mask [, count]):

Définir une fonction en tant que fonction hameçon. La chaîne de caractères mask et le nombre count déterminent à quel moment la fonction hameçon sera appelée. Le masque est une chaîne de caractères composée des caractères suivants, chacun ayant un sens :

  • 'c': Toutes les fois que Lua appelle une fonction, appelle le hook;

  • 'r': Toutes les fois que Lua revient d'une fonction, appelle le hook;

  • 'l': Toutes les fois que Lua entre dans une nouvelle ligne, appelle le hook.

11.setlocal ([thread,] level, local, value):

Cette fonction assigne value à la variable locale de la fonction de niveau level de la pile. Si cette variable n'existe pas, la fonction retourne nil. Si level est hors des limites, elle lève une erreur.

12.setmetatable (value, table):

Définit la métatable de value en table (peut être nil). Retourne value.

13.setupvalue (f, up, value):

Cette fonction met value à la valeur de la valeur de la fonction f du up-ème niveau. Si la fonction n'a pas cette valeur, elle retourne nil. Sinon, elle retourne le nom de cette valeur.

14.traceback ([thread,] [message [, level]]):

Si le message est présent et qu'il n'est pas une chaîne ou nil, la fonction ne fait rien et retourne directement le message. Sinon, il retourne les informations de pile d'appel de la pile. La chaîne optionnelle message est ajoutée au début des informations de pile d'appel. Le nombre optionnel level indique à partir de quel niveau de la pile commencer le retour (par défaut de 1 soit l'appel à traceback).

Le tableau suivant liste nos fonctions de débogage courantes, puis nous pouvons voir quelques exemples simples :

function myfunction()
print(debug.traceback("Pile d'exécution"))
print(debug.getinfo(1))
print("Fin de la pile d'exécution")
        return 10
end

print(debug.getinfo(1))

Le résultat de l'exécution du code ci-dessus est :

Pile d'exécution
pile d'exécution traceback:
    test2.lua:2: dans la fonction 'myfunction'
    test2.lua:8: dans le morceau principal
    [C]: ?
table: 0054C6C8
Fin de la pile d'exécution

Dans cet exemple, nous avons utilisé les fonctions traceback et getinfo de la bibliothèque debug, la fonction getinfo est utilisée pour retourner un tableau d'informations sur la fonction.

Un autre exemple

Nous avons souvent besoin de déboguer les variables locales à l'intérieur des fonctions. Nous pouvons utiliser la fonction getupvalue pour définir ces variables locales. Voici un exemple :

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 augmente automatiquement à chaque appel1. Dans l'exemple, nous avons utilisé la fonction getupvalue pour afficher l'état actuel de la variable locale. Nous pouvons configurer la variable locale avec une nouvelle valeur. Dans l'exemple, avant de configurer, la valeur de n est 2, nous la configurons en utilisant la fonction setupvalue 10. Maintenant, nous appelons la fonction, après l'exécution, la sortie est 11 plutôt que 3.

Type de débogage

  • Débogage en ligne de commande

  • Débogage d'interface graphique

Les débugueurs en ligne de commande incluent : RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.

Les débugueurs d'interface graphique incluent : SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.