Biblioteca debug și Introspecție în Lua: debug.getinfo, debug.traceback și debug.sethook în Lua

Ghid complet pentru biblioteca debug în Lua: analizarea stivei de apeluri cu debug.getinfo, inspecția variabilelor locale cu debug.getlocal și crearea de profilere/debuggere cu debug.sethook.

Sintaxă
debug.getinfo(1, "nSl"); debug.getlocal(1, 1); debug.sethook(hook, "crl")

Biblioteca standard debug oferă acces intern la stiva de execuție, variabilele locale și mașina virtuală Lua. Deși este destinată depanării și instrumentării de cod, funcțiile sale sunt esențiale pentru construirea de cadre de testare, loggere avansate și profilere de performanță.

Inspecția stivei de apeluri și metadatelor de funcție cu debug.getinfo
local function functieExemplu(param1, param2)
    -- Nivelul 1 reprezintă funcția curentă, nivelul 2 este apelantul ei:
    local info = debug.getinfo(1, "nSl")
    
    print("Numele funcției:", info.name)          -- "functieExemplu"
    print("Sursa fișierului:", info.short_src)    -- cale fișier sau string
    print("Linia curentă de cod:", info.currentline)
    print("Ce tip de cod este:", info.what)       -- "Lua" sau "C"
end

functieExemplu("test", 123)
Inspectarea variabilelor locale din stivă cu debug.getlocal
local function calculeazaTotal(pret, tva)
    local coeficient = 1.19
    local total = (pret + tva) * coeficient

    -- Iterăm prin toate variabilele locale ale nivelului 1:
    local index = 1
    while true do
        local nume, valoare = debug.getlocal(1, index)
        if not nume then break end
        print(string.format("Variabilă locală [%d]: %s = %s", index, nume, tostring(valoare)))
        index = index + 1
    end

    return total
end

calculeazaTotal(100, 20)
Avertisment de performanță: Funcțiile din biblioteca debug dezactivează anumite optimizări ale compilatorului JIT și au un cost de rulare ridicat. Nu le folosiți în bucle critice de producție decât pentru logarea excepțiilor.