Lua Academy · Lektion

debug-biblioteket i dybden

Brug debug.traceback, getinfo, getlocal og getupvalue til introspektion.

Lektion 1 af 413 trin

debug-biblioteket i dybden er en gratis Lua Academy-lektion på CoddyKit. Dette er lektion 1 af 4. Du kan læse alle 3 lektioner i dette læringsspor gratis i deres fulde længde — derefter låser CoddyKit PRO alle lektioner op samt praktiske øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Den er en del af læringsforløbet i Lua Academy, og dine fremskridt synkroniseres på tværs af nettet og CoddyKit-appen. Lua Academy-kurset indeholder 4 lektioner i alt.

Oversigt over debug-biblioteket

debug-biblioteket er Lua's værktøj til introspektion. Det lader dig inspicere og ændre kørselstilstanden for enhver funktion, koroutine eller stakramme.

Dybdegående gennemgang af debug.getinfo

debug.getinfo(f, what) accepterer what-flag: "n" (navn), "S" (kilde), "l" (aktuel linje), "u" (upvalues), "f" (funktionsreference).

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

Inspektion af lokale variable

debug.getlocal(level, n) returnerer navnet og værdien for den n-te lokale variabel på et givet stakniveau. Niveau 1 = den aktuelle funktion.

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

Ændring af lokale variable

debug.setlocal(level, n, value) ændrer værdien af en lokal variabel under kørsel – det er nyttigt til fejlfinding og test.

Inspektion af upvalues

debug.getupvalue(fn, n) returnerer navnet og værdien for den n-te upvalue i en funktion. Gentag med stigende n, indtil nil returneres.

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

Gennemgang af kaldestakken

Gennemgå hele kaldestakken ved at øge niveauet, indtil debug.getinfo returnerer 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) returnerer en formateret streng med stakspor. Det er den mest praktiske debug-funktion til fejlhåndtering i produktionsmiljøer.

Inspektion af koroutiner

Videregiv en koroutine som det første argument til debug.getinfo for at inspicere dens stak.

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

debug.sethook til sporing

Spor alle funktionskald i et program ved at indstille et kald-hook, der udskriver funktionsnavne.

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

Bærbare assertions

Brug debug.getinfo(2, "Sl") til at inkludere fil- og linjeoplysninger i fejl fra assertions.

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

Forsigtig

Debug-biblioteket kan bryde indkapsling, gøre programmer markant langsommere, især debug.sethook, og er ikke tilgængeligt i alle miljøer. Brug det kun under udvikling og test.

Spørgsmål om debug-biblioteket

Hvad returnerer debug.getupvalue(fn, 1)?

Opsummering: debug-biblioteket i dybden

Debug-biblioteket giver stakinspektion (getinfo), inspektion og ændring af lokale variable (getlocal/setlocal), adgang til upvalues (getupvalue/setupvalue) og hook-baseret sporing (sethook). Brug det kun ansvarligt under udvikling.

Gratis at komme i gang

Lær Lua med en AI-underviser — gratis

Skriv og kør rigtig kode i din browser, få øjeblikkelig hjælp fra en AI-underviser døgnet rundt, og fortsæt, hvor du slap, på web eller i appen.

Kurser
40
Lektioner
159

Ofte stillede spørgsmål

Er lektionen “debug-biblioteket i dybden” gratis?

Ja — alle 3 lektioner i læringssporet Lua Academy, inklusive “debug-biblioteket i dybden”, kan læses gratis i deres fulde længde her på webstedet. Derefter låser CoddyKit PRO alle lektioner op samt interaktive øvelser med en indbygget kodeeditor og en AI-underviser døgnet rundt. Lua Academy-kurset indeholder 4 lektioner i alt.

Hvad lærer jeg i “debug-biblioteket i dybden”?

Brug debug.traceback, getinfo, getlocal og getupvalue til introspektion. Du øver dig i Lua Academy med praktisk kode, som du kører direkte i browseren, og en AI-vejleder døgnet rundt besvarer dine spørgsmål, mens du arbejder dig gennem lektionen.

Skal jeg have erfaring for at begynde på Lua Academy?

Der kræves ingen tidligere erfaring. Lua Academy på CoddyKit er tilrettelagt for både begyndere og øvede, så du kan starte her eller fra begyndelsen og lære i dit eget tempo. Dette er lektion 1 af 4.

Hvor lang tid tager lektionen “debug-biblioteket i dybden”?

De fleste CoddyKit-lektioner tager cirka 5–10 minutter. Hver lektion er kort og interaktiv, så du gør løbende fremskridt og kan fortsætte, hvor du slap – på både web og app.

Kan jeg skrive og køre kode i denne Lua Academy-lektion?

Ja. Alle Lua Academy-lektioner har en indbygget kodeeditor, så du kan skrive og køre rigtig kode direkte i din browser og få øjeblikkelig feedback fra AI – uden lokal opsætning.

Alle lektioner i dette kursus

  1. debug-biblioteket i dybden
  2. Remote debugging med MobDebug
  3. Profilering med LuaProfiler
  4. Kodedækning og testinstrumentering
← Tilbage til Lua Academy