Lua - Depuración

Lua proporciona una biblioteca de depuración, que proporciona todas las funciones primitivas para que creemos nuestro propio depurador. Aunque no hay un depurador de Lua incorporado, tenemos muchos depuradores para Lua, creados por varios desarrolladores, muchos de los cuales son de código abierto.

Las funciones disponibles en la biblioteca de depuración de Lua se enumeran en la siguiente tabla junto con sus usos.

No Señor. Método y propósito
1

debug()

Ingresa al modo interactivo para la depuración, que permanece activo hasta que escribimos solo cont en una línea y presionamos enter. El usuario puede inspeccionar variables durante este modo usando otras funciones.

2

getfenv(object)

Devuelve el entorno del objeto.

3

gethook(optional thread)

Devuelve la configuración de gancho actual del hilo, como tres valores: la función de gancho actual, la máscara de gancho actual y el recuento de gancho actual.

4

getinfo(optional thread, function or stack level, optional flag)

Devuelve una tabla con información sobre una función. Puede dar la función directamente, o puede dar un número como el valor de la función, lo que significa que la función que se ejecuta en el nivel de la función de la pila de llamadas del hilo dado - el nivel 0 es la función actual (getinfo en sí); el nivel 1 es la función que se llama getinfo; y así. Si la función es un número mayor que el número de funciones activas, entonces getinfo devuelve nil.

5

getlocal(optional thread, stack level, local index)

Devuelve el nombre y el valor de la variable local con índice local de la función en el nivel de la pila. Devuelve nulo si no hay una variable local con el índice dado, y genera un error cuando se llama con un nivel fuera de rango.

6

getmetatable(value)

Devuelve la metatabla del objeto dado o nil si no tiene una metatabla.

7

getregistry()

Devuelve la tabla de registro, una tabla predefinida que puede ser utilizada por cualquier código C para almacenar cualquier valor de Lua que necesite almacenar.

8

getupvalue(function, upvalue index)

Esta función devuelve el nombre y el valor del upvalue con index up de la función func. La función devuelve nil si no hay ningún valor de subida con el índice dado.

9

setfenv(function or thread or userdata, environment table)

Establece el entorno del objeto dado en la tabla dada. Devuelve el objeto.

10

sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count)

Establece la función dada como un gancho. La máscara de cadena y el recuento de números describen cuándo se llamará al gancho. Aquí, c, r y l se llaman cada vez que Lua llama, devuelve e ingresa cada línea de código en una función, respectivamente.

11

setlocal(optional thread, stack level, local index, value)

Asigna el valor a la variable local con índice local de la función a nivel de la pila. La función devuelve nil si no hay una variable local con el índice dado y genera un error cuando se llama con un nivel fuera de rango. De lo contrario, devuelve el nombre de la variable local.

12

setmetatable(value, metatable)

Establece la metatabla para el objeto dado en la tabla dada (que puede ser nula).

13

setupvalue(function, upvalue index, value)

Esta función asigna el valor al upvalue con index up de la función func. La función devuelve nil si no hay ningún valor de subida con el índice dado. De lo contrario, devuelve el nombre del upvalue.

14

traceback(optional thread, optional message string, optional level argument)

Genera un mensaje de error extendido con seguimiento.

La lista anterior es la lista completa de funciones de depuración en Lua y, a menudo, usamos una biblioteca que usa las funciones anteriores y proporciona una depuración más fácil. Usar estas funciones y crear nuestro propio depurador es bastante complicado y no es preferible. De todos modos, veremos un ejemplo de uso simple de funciones de depuración.

function myfunction ()
   print(debug.traceback("Stack trace"))
   print(debug.getinfo(1))
   print("Stack trace end")

   return 10
end

myfunction ()
print(debug.getinfo(1))

Cuando ejecutamos el programa anterior, obtendremos el seguimiento de la pila como se muestra a continuación.

Stack trace
stack traceback:
	test2.lua:2: in function 'myfunction'
	test2.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end

En el programa de muestra anterior, el seguimiento de la pila se imprime utilizando la función debug.trace disponible en la biblioteca de depuración. El debug.getinfo obtiene la tabla actual de la función.

Depuración - Ejemplo

A menudo necesitamos conocer las variables locales de una función para depurar. Para ese propósito, podemos usar getupvalue y para establecer estas variables locales, usamos setupvalue. A continuación se muestra un ejemplo sencillo de esto.

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())

Cuando ejecutamos el programa anterior, obtendremos el siguiente resultado.

1
2
index	1	k	=	1
index	2	n	=	2
11

En este ejemplo, el contador se actualiza en uno cada vez que se llama. Podemos ver el estado actual de la variable local usando la función getupvalue. Luego establecemos la variable local en un nuevo valor. Aquí, n es 2 antes de que se llame a la operación de conjunto. Usando la función setupvalue, se actualiza a 10. Ahora, cuando llamemos a la función de contador, devolverá 11 en lugar de 3.

Tipos de depuración

  • Depuración de línea de comando
  • Depuración gráfica

Depuración de línea de comandos

La depuración de la línea de comandos es el tipo de depuración que utiliza la línea de comandos para depurar con la ayuda de comandos y declaraciones de impresión. Hay muchos depuradores de línea de comandos disponibles para Lua, algunos de los cuales se enumeran a continuación.

  • RemDebug- RemDebug es un depurador remoto para Lua 5.0 y 5.1. Le permite controlar la ejecución de otro programa Lua de forma remota, estableciendo puntos de interrupción e inspeccionando el estado actual del programa. RemDebug también puede depurar scripts CGILua.

  • clidebugger- Un depurador de interfaz de línea de comandos simple para Lua 5.1 escrito en Lua puro. No depende de nada más que de las bibliotecas estándar de Lua 5.1. Se inspiró en RemDebug pero no tiene sus instalaciones remotas.

  • ctrace - Una herramienta para rastrear llamadas API de Lua.

  • xdbLua - Un depurador de línea de comandos de Lua simple para la plataforma Windows.

  • LuaInterface - Debugger- Este proyecto es una extensión de depuración para LuaInterface. Eleva la interfaz de depuración de Lua incorporada a un nivel superior. La interacción con el depurador se realiza mediante eventos y llamadas a métodos.

  • Rldb- Este es un depurador remoto de Lua a través de socket, disponible tanto en Windows como en Linux. Puede brindarle muchas más funciones que cualquier otra existente.

  • ModDebug - Esto permite controlar la ejecución de otro programa Lua de forma remota, establecer puntos de interrupción e inspeccionar el estado actual del programa.

Depuración gráfica

La depuración gráfica está disponible con la ayuda de IDE, donde se le proporciona la depuración visual de varios estados como valores de variables, seguimiento de pila y otra información relacionada. Hay una representación visual y un control paso a paso de la ejecución con la ayuda de puntos de interrupción, paso a paso, paso a paso y otros botones en el IDE.

Hay varios depuradores gráficos para Lua e incluye lo siguiente.

  • SciTE - El IDE de Windows predeterminado para Lua proporciona múltiples funciones de depuración como puntos de interrupción, paso, paso a paso, paso a paso, variables de observación, etc.

  • Decoda - Este es un depurador gráfico con soporte de depuración remota.

  • ZeroBrane Studio- Lua IDE con depurador remoto integrado, vista de pila, vista de reloj, consola remota, analizador estático y más. Funciona con LuaJIT, Love2d, Moai y otros motores Lua; Windows, OSX y Linux. Fuente abierta.

  • akdebugger - Plugin de depurador y editor Lua para Eclipse.

  • luaedit - Esto incluye depuración remota, depuración local, resaltado de sintaxis, lista de propuestas de finalización, motor de propuesta de parámetros, gestión avanzada de puntos de interrupción (incluido el sistema de condiciones en puntos de interrupción y recuento de aciertos), listado de funciones, listado de variables globales y locales, relojes, gestión orientada a soluciones.