Lua Depuración (Debug)
Lua proporciona la biblioteca debug para ofrecer la funcionalidad de crear nuestros propios depuradores. Lua en sí no tiene un depurador integrado, pero muchos desarrolladores han compartido su código de depurador de Lua.
La biblioteca debug de Lua contiene las siguientes funciones:
| N.º | Método y uso |
|---|---|
| 1. | debug(): Entra en un modo de interacción con el usuario, ejecutando cada cadena que el usuario introduce. Con comandos simples y otros ajustes de depuración, el usuario puede inspeccionar variables globales y locales, cambiar el valor de las variables, evaluar expresiones, etc. |
| 2. | getfenv(object): Devuelve la tabla de entorno del objeto. |
| 3. | gethook(optional thread): Devuelve tres valores que representan la configuración de los hooks del hilo: la función de hook actual, la máscara de hook actual, el contador de hook actual. |
| 4. | getinfo ([thread,] f [, what]): Devuelve una tabla con información sobre una función. Puedes proporcionar directamente la función, o usar un número f para representarla. El número f representa la función en el nivel correspondiente de la pila de llamadas del hilo especificado: el nivel 0 es la función actual (la propia getinfo); el nivel 1 es la función que llamó a getinfo (a menos que sea una llamada de cola, que no se cuenta 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 de la variable local con índice local de la función en el nivel f de la pila. Esta función no solo se usa para acceder a variables locales definidas explícitamente, sino también a parámetros formales, variables temporales, etc. |
| 6. | getmetatable(value): Empuja la metatabla del valor apuntado por el índice dado en la pila. Si el índice no es válido, o si el valor no tiene metatabla, la función devuelve 0 y no empuja nada a la pila. |
| 7. | getregistry(): Devuelve la tabla de registro, que es una tabla predefinida que se puede usar para guardar cualquier valor de Lua que el código C desee guardar. |
| 8. | getupvalue (f, up) Esta función devuelve el nombre y el valor del upvalue número up de la función f. Si la función no tiene ese upvalue, devuelve nil. |
| 10. | sethook ([thread,] hook, mask [, count]): Establece una función como función de hook. La cadena mask y el número count determinan cuándo se llamará al hook. La máscara es una cadena compuesta por los siguientes caracteres, cada uno con su significado:
|
| 11. | setlocal ([thread,] level, local, value): Esta función asigna value a la variable local número local de la función en el nivel level de la pila. Si no existe esa variable, la función devuelve nil. Si level está fuera de rango, 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 asigna value como el upvalue número up de la función f. Si la función no tiene ese upvalue, devuelve nil; de lo contrario, devuelve el nombre de ese upvalue. |
| 14. | traceback ([thread,] [message [, level]]): Si message existe y no es una cadena ni nil, la función devuelve message directamente sin hacer nada más. De lo contrario, devuelve la información de retroceso de la pila de llamadas. La cadena opcional message se añade al comienzo de la información de retroceso. El número opcional level indica desde qué nivel de la pila comenzar el retroceso (por defecto es 1, es decir, donde se llama a traceback). |
La tabla anterior enumera las funciones de depuración de uso común. A continuación podemos ver algunos ejemplos sencillos:
Ejemplo
print(debug.traceback("Stack trace"))
print(debug.getinfo(1))
print("Stack trace end")
return 10
end
myfunction ()
print(debug.getinfo(1))
Al ejecutar el código anterior, el resultado es:
Stack trace stack traceback: test2.lua:2: in function 'myfunction' test2.lua:8: in main chunk [C]: ? table: 0054C6C8 Stack trace end
En el ejemplo anterior, hemos usado las funciones traceback y getinfo de la biblioteca debug. La función getinfo se usa para devolver una tabla con información de la función.
Otro ejemplo
Frecuentemente necesitamos depurar las variables locales dentro de una función. Podemos usar la función setupvalue para establecer estas variables locales. Ejemplo:
Ejemplo
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())
Al ejecutar el código anterior, el resultado es:
1 2 index 1 k = 1 index 2 n = 2 11
En el ejemplo anterior, el contador se incrementa en 1 en cada llamada. En el ejemplo usamos la función getupvalue para ver el estado actual de la variable local. Podemos establecer la variable local a un nuevo valor. En el ejemplo, antes de establecerlo, el valor de n es 2; usando la función setupvalue lo establecemos en 10. Ahora llamamos a la función; después de la ejecución, la salida es 11 en lugar de 3.
Tipos de depuración
- Depuración por línea de comandos
- Depuración con interfaz gráfica
Los depuradores de línea de comandos incluyen: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.
Los depuradores con interfaz gráfica incluyen: SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.
Otras extensiones