Lua - Debug

Lua fornisce una libreria di debug, che fornisce tutte le funzioni primitive per noi per creare il nostro debugger. Anche se non esiste un debugger Lua integrato, abbiamo molti debugger per Lua, creati da vari sviluppatori e molti sono open source.

Le funzioni disponibili nella libreria di debug di Lua sono elencate nella tabella seguente insieme ai suoi usi.

Sr.No. Metodo e scopo
1

debug()

Entra in modalità interattiva per il debug, che rimane attivo fino a quando non digitiamo solo cont in una riga e premiamo invio. L'utente può ispezionare le variabili durante questa modalità utilizzando altre funzioni.

2

getfenv(object)

Restituisce l'ambiente dell'oggetto.

3

gethook(optional thread)

Restituisce le impostazioni di hook correnti del thread, come tre valori: la funzione di hook corrente, la maschera di hook corrente e il conteggio di hook corrente.

4

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

Restituisce una tabella con informazioni su una funzione. Puoi dare la funzione direttamente, oppure puoi dare un numero come valore di funzione, il che significa che la funzione in esecuzione a livello di funzione dello stack di chiamate del thread dato - il livello 0 è la funzione corrente (getinfo stesso); il livello 1 è la funzione che ha chiamato getinfo; e così via. Se function è un numero maggiore del numero di funzioni attive, getinfo restituisce nil.

5

getlocal(optional thread, stack level, local index)

Restituisce il nome e il valore della variabile locale con indice locale della funzione a livello di stack.Restituisce nil se non è presente alcuna variabile locale con l'indice dato e genera un errore quando viene chiamata con un livello fuori intervallo.

6

getmetatable(value)

Restituisce il metable dell'oggetto specificato o nil se non ha un metatable.

7

getregistry()

Restituisce la tabella del registro, una tabella predefinita che può essere utilizzata da qualsiasi codice C per memorizzare qualsiasi valore Lua che deve memorizzare.

8

getupvalue(function, upvalue index)

Questa funzione restituisce il nome e il valore dell'upvalue con indice in alto della funzione func. La funzione restituisce nil se non è presente alcun upvalue con l'indice specificato.

9

setfenv(function or thread or userdata, environment table)

Imposta l'ambiente dell'oggetto dato sulla tabella data. Restituisce oggetto.

10

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

Imposta la funzione data come hook. La maschera della stringa e il conteggio del numero descrivono quando verrà chiamato l'hook. Qui, c, r e l vengono chiamati ogni volta che Lua chiama, restituisce e inserisce ogni riga di codice in una funzione rispettivamente.

11

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

Assegna il valore alla variabile locale con indice locale della funzione a livello di stack. La funzione restituisce nil se non esiste una variabile locale con l'indice dato e genera un errore quando viene chiamata con un livello fuori intervallo. In caso contrario, restituisce il nome della variabile locale.

12

setmetatable(value, metatable)

Imposta il metatable per l'oggetto dato sulla tabella data (che può essere zero).

13

setupvalue(function, upvalue index, value)

Questa funzione assegna il valore all'upvalue con indice verso l'alto della funzione func. La funzione restituisce nil se non è presente alcun upvalue con l'indice specificato. In caso contrario, restituisce il nome dell'upvalue.

14

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

Crea un messaggio di errore esteso con un traceback.

L'elenco sopra è l'elenco completo delle funzioni di debug in Lua e spesso usiamo una libreria che utilizza le funzioni precedenti e fornisce un debug più semplice. Usare queste funzioni e creare il nostro debugger è piuttosto complicato e non è preferibile. Ad ogni modo, vedremo un esempio di semplice utilizzo delle funzioni di debug.

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

   return 10
end

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

Quando eseguiamo il programma sopra, otterremo la traccia dello stack come mostrato di seguito.

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

Nel programma di esempio precedente, la traccia dello stack viene stampata utilizzando la funzione debug.trace disponibile nella libreria di debug. Il debug.getinfo ottiene la tabella corrente della funzione.

Debug - Esempio

Spesso abbiamo bisogno di conoscere le variabili locali di una funzione per il debug. A tale scopo, possiamo usare getupvalue e per impostare queste variabili locali, usiamo setupvalue. Un semplice esempio per questo è mostrato di seguito.

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

Quando eseguiamo il programma precedente, otterremo il seguente output.

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

In questo esempio, il contatore si aggiorna di uno ogni volta che viene chiamato. Possiamo vedere lo stato corrente della variabile locale utilizzando la funzione getupvalue. Quindi impostiamo la variabile locale su un nuovo valore. Qui, n è 2 prima che venga chiamata l'operazione di impostazione. Usando la funzione setupvalue, viene aggiornato a 10. Ora, quando chiamiamo la funzione counter, restituirà 11 invece di 3.

Tipi di debug

  • Debug della riga di comando
  • Debug grafico

Debug della riga di comando

Il debug della riga di comando è il tipo di debug che utilizza la riga di comando per eseguire il debug con l'aiuto di comandi e istruzioni di stampa. Sono disponibili molti debugger della riga di comando per Lua di cui alcuni sono elencati di seguito.

  • RemDebug- RemDebug è un debugger remoto per Lua 5.0 e 5.1. Ti consente di controllare l'esecuzione di un altro programma Lua da remoto, impostando i punti di interruzione e ispezionando lo stato corrente del programma. RemDebug può anche eseguire il debug degli script CGILua.

  • clidebugger- Un semplice debugger dell'interfaccia della riga di comando per Lua 5.1 scritto in puro Lua. Non dipende da nient'altro che dalle librerie standard Lua 5.1. È stato ispirato da RemDebug ma non ha le sue strutture remote.

  • ctrace - Uno strumento per tracciare le chiamate API Lua.

  • xdbLua - Un semplice debugger della riga di comando Lua per la piattaforma Windows.

  • LuaInterface - Debugger- Questo progetto è un'estensione del debugger per LuaInterface. Porta l'interfaccia di debug Lua incorporata a un livello superiore. L'interazione con il debugger viene eseguita da eventi e chiamate al metodo.

  • Rldb- Questo è un debugger Lua remoto tramite socket, disponibile sia su Windows che su Linux. Può darti molte più funzionalità di qualsiasi altra esistente.

  • ModDebug - Ciò consente di controllare l'esecuzione di un altro programma Lua in remoto, impostare punti di interruzione e ispezionare lo stato corrente del programma.

Debug grafico

Il debug grafico è disponibile con l'aiuto di IDE in cui viene fornito il debug visivo di vari stati come valori di variabili, traccia dello stack e altre informazioni correlate. C'è una rappresentazione visiva e un controllo graduale dell'esecuzione con l'aiuto di breakpoint, step into, step over e altri pulsanti nell'IDE.

Esistono numerosi debugger grafici per Lua e include quanto segue.

  • SciTE - L'IDE di Windows predefinito per Lua fornisce più funzionalità di debug come breakpoint, step, step into, step over, watch variabili e così via.

  • Decoda - Questo è un debugger grafico con supporto per il debug remoto.

  • ZeroBrane Studio- Lua IDE con debugger remoto integrato, visualizzazione stack, visualizzazione Watch, console remota, analizzatore statico e altro ancora. Funziona con LuaJIT, Love2d, Moai e altri motori Lua; Windows, OSX e Linux. Open source.

  • akdebugger - Debugger ed editore plugin Lua per Eclipse.

  • luaedit - Presenta debug remoto, debug locale, evidenziazione della sintassi, elenco delle proposte di completamento, motore di proposizione dei parametri, gestione avanzata dei punti di interruzione (incluso il sistema delle condizioni sui punti di interruzione e il conteggio degli hit), elenco delle funzioni, elenco delle variabili globali e locali, orologi, gestione orientata alla soluzione.