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

调试(Debug) Lua

Lua fornisce la libreria debug per fornire la funzionalità di creare il nostro debugger personalizzato. Lua non ha un debugger integrato, ma molti sviluppatori hanno condiviso il loro codice di debugger Lua.

La libreria debug di Lua contiene le seguenti funzioni:

NumeroMetodo & Finalità
1.debug():

Entrare in un modalità di interazione utente, eseguire ogni stringa inserita dall'utente. Utilizzando comandi semplici e altre impostazioni di debug, l'utente può esaminare le variabili globali e locali, modificare i valori delle variabili, calcolare alcune espressioni, ecc.
Inserire una stringa che contiene solo il carattere 'cont' per terminare questa funzione, in modo che il chiamante possa continuare a eseguire.

2.getfenv(object):

Restituisce l'ambiente delle variabili dell'oggetto.

3.gethook(optional thread):

Restituisce tre valori che rappresentano le impostazioni dei hook della thread: funzione hook corrente, maschera hook corrente, conteggio hook corrente

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

Restituisce una tabella con informazioni su una funzione. Puoi fornire direttamente la funzione o utilizzare un numero f per rappresentare la funzione. Il numero f rappresenta la funzione corrispondente al livello della pila della chiamata di un thread specificato: 0 livello rappresenta la funzione corrente (getinfo stesso); 1 livello rappresenta la funzione che chiama getinfo (a meno che non sia una chiamata di coda, in questo caso non viene inclusa nella pila); ecc. Se f è un numero maggiore del numero di funzioni attive, getinfo restituisce nil.

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

Questa funzione restituisce il nome e il valore del variabile locale dell'indice della funzione a livello f della pila. Questa funzione non viene utilizzata solo per accedere ai variabili locali espressamente definite, ma anche ai parametri di forma, variabili temporanee, ecc.

6.getmetatable(value):

Pila la tabella di metadati del valore puntato dall'indice specificato. Se l'indice è invalido o il valore non ha una tabella di metadati, la funzione restituisce 0 e non pila nulla sulla pila. Se l'indice è invalido o il valore non ha una tabella di metadati, la funzione restituisce 0 e non pila nulla sulla pila.

7.getregistry():

Restituisce la tabella del registro, una tabella predefinita che può essere utilizzata per salvare qualsiasi valore Lua che il codice C desidera salvare.

8.getupvalue (f, up)

Questa funzione restituisce il nome e il valore dell'up-esimo valore superiore della funzione f. Se questa funzione non ha tale valore superiore, restituisce nil.
Un nome di variabile che inizia con '(' (apice) rappresenta una variabile senza nome (codice blocco privo di informazioni di debug).

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

Imposta una funzione come funzione hook. La stringa mask e il numero count determinano quando viene chiamato l'hook. La maschera è una stringa composta da combinazioni di caratteri, ciascuno con un significato:

  • 'c': Ogni volta che Lua chiama una funzione, viene chiamato l'hook;

  • 'r': Ogni volta che Lua torna da una funzione, viene chiamato l'hook;

  • 'l': Ogni volta che Lua entra in una nuova riga, chiama l'hook.

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

Questa funzione assegna value alla variabile locale della funzione di livello level sulla pila. Se non esiste quella variabile, la funzione restituisce nil. Se level è fuori dagli limiti, lancia un errore.

12.setmetatable (value, table):

Imposta la metatabella di value come table (può essere nil). Restituisce value.

13.setupvalue (f, up, value):

Questa funzione imposta value come il valore superiore della funzione f alla posizione up. Se la funzione non ha quel valore superiore, restituisce nil; altrimenti, restituisce il nome del valore superiore.

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

Se message esiste e non è una stringa o nil, la funzione non esegue alcun processo e restituisce direttamente message. Altrimenti, restituisce le informazioni di tracciamento della pila di chiamate. L'opzionale message di stringa può essere aggiunto all'inizio delle informazioni di tracciamento della pila di chiamate. L'opzionale livello numerico specifica da quale livello della pila iniziare il tracciamento (predefinito a 1, ovvero dove è stato chiamato traceback).

La tabella sopra elenca le nostre funzioni di debug più utilizzate, e ora possiamo vedere alcuni esempi semplici:

function myfunction ()
print(debug.traceback("Trace stack"))
print(debug.getinfo(1))
print("Fine trace stack")
        return 10
end
myfunction ()
print(debug.getinfo(1))

Esegui il codice sopra e l'output sarà:

Trace stack
traceback stack:
    test2.lua:2: in funzione 'myfunction'
    test2.lua:8: in main chunk
    [C]: ?
tabella: 0054C6C8
Fine trace stack

In questo esempio, abbiamo utilizzato le funzioni traceback e getinfo della libreria debug, dove getinfo restituisce una tabella di informazioni sulla funzione.

Un altro esempio

Spesso dobbiamo debuggare le variabili locali all'interno delle funzioni. Possiamo utilizzare la funzione getupvalue per impostare queste variabili locali. Ecco un esempio:

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

Esegui il codice sopra e l'output sarà:

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

Nell'esempio sopra, il contatore aumenta di 1 ogni volta che viene chiamata. Nell'esempio abbiamo utilizzato la funzione getupvalue per visualizzare lo stato attuale della variabile locale. Possiamo impostare la variabile locale su un nuovo valore. Nell'esempio, prima di impostare n a 2, lo impostiamo a 10 utilizzando la funzione setupvalue. Ora chiamiamo la funzione, dopo l'esecuzione l'output è 11 invece di 3.

Tipo di debug

  • Debugging a riga di comando

  • Debugging a interfaccia grafica

Debugger a riga di comando: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.

Debugger a interfaccia grafica: SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.