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

depuración(Debug) Lua

Lua proporciona la biblioteca de depuración para proporcionar la función de creación de nuestros depuradores personalizados. Lua en sí mismo no tiene depurador integrado, pero muchos desarrolladores han compartido su código de depurador de Lua.

La biblioteca debug de Lua contiene las siguientes funciones:

NúmeroMétodo & Propósito
1.debug():

Entrar en un modo de interacción del usuario, ejecutar cada cadena ingresada por el usuario. Con comandos simples y otros ajustes de depuración, el usuario puede revisar las variables globales y locales, cambiar los valores de las variables, calcular algunas expresiones, etc.
Escribir una cadena de una línea que solo contiene cont finalizará esta función, permitiendo que el llamador continúe ejecutándose.

2.getfenv(object):

Devuelve las variables de entorno del objeto.

3.gethook(optional thread):

Devuelve tres valores que representan los valores configurados del gancho de hilo: la función de gancho actual, la máscara de gancho actual, el contador de gancho actual

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

Devuelve una tabla con información sobre una función. Puede proporcionar directamente la función o usar un número f para representar la función. El número f representa la función en el nivel correspondiente de la pila de llamadas del hilo especificado: 0 nivel representa la función actual (getinfo mismo); 1 El nivel representa la función que llama a getinfo (a menos que sea una llamada final, en este caso no se incluye en la pila); etc. Si f es un número mayor que el número de funciones activas, getinfo devuelve nil.

5.debug.getlocal ([thread,] f, local):

Esta función devuelve el nombre y el valor del variable local en el nivel f de la pila de funciones. Esta función no solo se utiliza para acceder a variables locales explícitamente definidas, sino también a parámetros formales, variables temporales, etc.

6.getmetatable(value):

Empuja la tabla de metadatos del valor apuntado por el índice dado en la pila. Si el índice es inválido o este valor no tiene una tabla de metadatos, la función devuelve 0 y no empuja nada en la pila.

7.getregistry():

Devuelve el registro de tabla, que es una tabla predefinida que se puede usar para guardar cualquier valor de Lua que desee guardar el código C.

8.getupvalue (f, up)

Esta función devuelve el nombre y el valor del valor superior de la función f en el índice up. Si esta función no tiene ese valor superior, devuelve nil.
Un nombre de variable que comienza con '(' (corchete abierto) representa una variable sin nombre (bloque de código sin información de depuración eliminada).

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

Insertar una función como función de gancho. La cadena mask y el número count determinan cuándo se llamará el gancho. La máscara es una cadena compuesta por los caracteres siguientes, cada uno tiene un significado:

  • 'c': Cada vez que Lua llama a una función, se llama al ganchero;

  • 'r': Cada vez que Lua regresa de una función, se llama al ganchero;

  • 'l': Cada vez que Lua entra en una nueva línea, se llama al ganchero.

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

Esta función asigna value a la variable local en la posición local de la función en la pila en el nivel level. Si no hay esa variable, la función devuelve nil. Si level está fuera de los límites, lanza un error.

12.setmetatable (value, table):

Establece la metatabla de value como table (puede ser nil). Devuelve value.

13.setupvalue (f, up, value):

Esta función establece value como el valor de la posición up de la función f. Si la función no tiene ese valor de la posición up, devuelve nil; de lo contrario, devuelve el nombre de ese valor de la posición up.

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

Si message existe y no es una cadena ni nil, la función no realiza ninguna acción y devuelve message directamente. De lo contrario, devuelve la información de retroceso de la pila de llamadas. La cadena opcional message se agrega al principio de la información de retroceso de la pila de llamadas. El número opcional level indica desde qué nivel de la pila comenzar el retroceso (por defecto de 1 es decir, donde se llama a traceback).

La tabla superior enumera las funciones de depuración que usamos comúnmente, a continuación, podemos ver algunos ejemplos simples:

function myfunction()
print(debug.traceback("Pila de llamadas"))
print(debug.getinfo(1))
print("Final de la pila de llamadas")
        devolver 10
fin
myfunction()
print(debug.getinfo(1))

el resultado de ejecutar el código anterior es:

Pila de llamadas
pila de llamadas:
    test2.lua:2: en la función 'myfunction'
    test2.lua:8: en el bloque principal
    [C]: ?
tabla: 0054C6C8
Final de la pila de llamadas

En este ejemplo, hemos utilizado las funciones traceback y getinfo de la biblioteca debug, donde getinfo devuelve una tabla con información de la función.

Otro ejemplo

A menudo necesitamos depurar las variables locales dentro de una función. Podemos usar la función getupvalue para configurar estas variables locales. Ejemplo a continuación:

función newCounter()
  local n = 0
  local k = 0
  volver función()
    k = n
    n = n + 1
    volver n
    fin
fin
counter = newCounter()
print(counter())
print(counter())
local i = 1
repetir
  name, val = debug.getupvalue(counter, i)
  si name entonces
    print("índice", i, name, "=", val)
        si(name == "n") entonces
                debug.setupvalue(counter,2,10)
        fin
    i = = i + 1
  fin -- si
hasta que no name
print(counter())

el resultado de ejecutar el código anterior es:

1
2
índice    1    k = =    1
índice    2    n = =    2
11

en el ejemplo, el contador se incrementa en cada llamada.1usamos la función setupvalue para establecer su valor. 2ahora llamamos a la función, después de ejecutar la salida es 10。 11 en lugar de 3。

tipos depuración

  • depuración línea de comandos

  • depuración interfaz gráfica

los depuradores de línea de comandos incluyen: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug。

los depuradores de interfaz gráfica incluyen: SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit。