0Pricing
Lua Academy · Lezione

La libreria debug in dettaglio

Utilizzi debug.traceback, getinfo, getlocal e getupvalue per l'introspezione.

La libreria debug in dettaglio è una lezione Lua Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento Lua Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso Lua Academy include 4 lezioni in totale.

Panoramica della libreria debug

La libreria debug è il toolkit di introspezione di Lua. Consente di ispezionare e modificare lo stato di runtime di qualsiasi funzione, coroutine o frame dello stack.

Approfondimento su debug.getinfo

debug.getinfo(f, what) accetta i flag what: "n" (nome), "S" (sorgente), "l" (riga corrente), "u" (upvalue), "f" (riferimento alla funzione).

local function foo()
  local info = debug.getinfo(1, "nSlu")
  print(info.name)        -- foo
  print(info.short_src)   -- source file
  print(info.currentline) -- line number
  print(info.nups)        -- number of upvalues
end
foo()

Ispezione delle variabili locali

debug.getlocal(level, n) restituisce il nome e il valore della variabile locale n-esima a un determinato livello dello stack. Il livello 1 corrisponde alla funzione corrente.

local function example()
  local x, y = 10, 20
  local i = 1
  while true do
    local name, val = debug.getlocal(1, i)
    if not name then break end
    print(name, val)
    i = i + 1
  end
end
example()  -- x 10 / y 20

Modifica delle variabili locali

debug.setlocal(level, n, value) modifica a runtime il valore di una variabile locale: è uno strumento potente per il debugging e i test.

Ispezione degli upvalue

debug.getupvalue(fn, n) restituisce il nome e il valore dell'upvalue n-esimo di una funzione. Iteri incrementando n finché non viene restituito nil.

local count = 0
local function inc() count = count + 1 end
print(debug.getupvalue(inc, 1))  -- count  0
debug.setupvalue(inc, 1, 99)
inc()
print(count)  -- 100

Esplorazione dello stack

Esplori l'intero stack delle chiamate incrementando il livello finché debug.getinfo non restituisce nil.

local function printStackTrace()
  local level = 1
  while true do
    local info = debug.getinfo(level, "Sln")
    if not info then break end
    print(level, info.short_src, info.currentline, info.name)
    level = level + 1
  end
end

debug.traceback

debug.traceback(msg, level) restituisce una stringa formattata con il trace dello stack. È la funzione di debug più pratica per la gestione degli errori in produzione.

Ispezione delle coroutine

Passi una coroutine come primo argomento a debug.getinfo per ispezionarne lo stack.

local co = coroutine.create(function()
  print(debug.getinfo(1, "l").currentline)
end)
coroutine.resume(co)

debug.sethook per il tracing

Tracci tutte le chiamate di funzione in un programma impostando un hook di chiamata che stampa i nomi delle funzioni.

debug.sethook(function(event)
  if event == "call" then
    local info = debug.getinfo(2, "Sn")
    print("CALL:", info.name or "?")
  end
end, "c")

Asserzioni portabili

Utilizzi debug.getinfo(2, "Sl") per includere le informazioni sul file e sulla riga negli errori delle asserzioni.

local function assert2(cond, msg)
  if not cond then
    local info = debug.getinfo(2, "Sl")
    error(("[%s:%d] %s"):format(info.short_src, info.currentline, msg), 2)
  end
end

Attenzione

La libreria debug può violare l'incapsulamento, rallentare notevolmente i programmi, soprattutto con debug.sethook, e non è disponibile in tutti gli ambienti. La utilizzi solo durante lo sviluppo e i test.

Domanda sulla libreria debug

Che cosa restituisce debug.getupvalue(fn, 1)?

Riepilogo: la libreria debug in dettaglio

La libreria debug offre l'ispezione dello stack (getinfo), l'ispezione e la modifica delle variabili locali (getlocal/setlocal), l'accesso agli upvalue (getupvalue/setupvalue) e il tracing basato sugli hook (sethook). La utilizzi responsabilmente e solo durante lo sviluppo.

Domande Frequenti

La lezione «La libreria debug in dettaglio» è gratuita?

Sì — il testo completo di «La libreria debug in dettaglio» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso Lua Academy, passa a CoddyKit PRO. Il corso Lua Academy include 4 lezioni in totale.

Cosa imparerò in «La libreria debug in dettaglio»?

Utilizzi debug.traceback, getinfo, getlocal e getupvalue per l'introspezione. Eserciti Lua Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare Lua Academy?

Non è richiesta alcuna esperienza precedente. Lua Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «La libreria debug in dettaglio»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione Lua Academy?

Sì. Ogni lezione Lua Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. La libreria debug in dettaglio
  2. Debug remoto con MobDebug
  3. Profilazione con LuaProfiler
  4. Code coverage e strumentazione dei test
← Torna a Lua Academy