0Pricing
Lua Academy · Aula

A biblioteca debug em profundidade

Use debug.traceback, getinfo, getlocal e getupvalue para introspecção.

A biblioteca debug em profundidade é uma aula grátis de Lua Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Lua Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Lua Academy inclui 4 aulas no total.

Visão geral da biblioteca de depuração

A biblioteca debug é o conjunto de ferramentas de introspecção do Lua. Ela permite inspecionar e modificar o estado de execução de qualquer função, corrotina ou quadro da pilha.

Análise aprofundada de debug.getinfo

debug.getinfo(f, what) aceita sinalizadores what: "n" (nome), "S" (origem), "l" (linha atual), "u" (valores externos), "f" (referência da função).

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

Inspeção de variáveis locais

debug.getlocal(level, n) retorna o nome e o valor da n-ésima variável local em um determinado nível da pilha. O nível 1 = função atual.

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ção de variáveis locais

debug.setlocal(level, n, value) altera o valor de uma variável local durante a execução — algo poderoso para depuração e testes.

Inspeção de valores externos

debug.getupvalue(fn, n) retorna o nome e o valor do n-ésimo valor externo de uma função. Itere aumentando n até que nil seja retornado.

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

Percurso da pilha

Percorra toda a pilha de chamadas incrementando o nível até que debug.getinfo retorne 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) retorna uma cadeia de caracteres formatada com o rastreamento da pilha. É a função de depuração mais prática para o tratamento de erros em produção.

Inspeção de corrotinas

Passe uma corrotina como primeiro argumento para debug.getinfo a fim de inspecionar a pilha dela.

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

debug.sethook para rastreamento

Rastreie todas as chamadas de função em um programa definindo um gancho de chamadas que imprima os nomes das funções.

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

Asserções portáteis

Use debug.getinfo(2, "Sl") para incluir informações sobre o arquivo e a linha nos erros de asserção.

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

Cuidado

A biblioteca de depuração pode violar o encapsulamento, tornar os programas significativamente mais lentos (especialmente com debug.sethook) e não estar disponível em todos os ambientes. Use-a somente durante o desenvolvimento e os testes.

Pergunta sobre a biblioteca de depuração

O que debug.getupvalue(fn, 1) retorna?

Recapitulação: biblioteca de depuração em profundidade

A biblioteca de depuração oferece inspeção da pilha (getinfo), inspeção e modificação de variáveis locais (getlocal/setlocal), acesso a valores externos (getupvalue/setupvalue) e rastreamento baseado em ganchos (sethook). Use-a com responsabilidade e somente durante o desenvolvimento.

Perguntas Frequentes

A aula “A biblioteca debug em profundidade” é grátis?

Sim — o texto completo de “A biblioteca debug em profundidade” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Lua Academy, atualize para CoddyKit PRO. O curso de Lua Academy inclui 4 aulas no total.

O que vou aprender em “A biblioteca debug em profundidade”?

Use debug.traceback, getinfo, getlocal e getupvalue para introspecção. Você pratica Lua Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.

Preciso ter experiência prévia para começar Lua Academy?

Nenhuma experiência prévia é necessária. Lua Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.

Quanto tempo leva a aula “A biblioteca debug em profundidade”?

A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.

Posso escrever e executar código nesta aula de Lua Academy?

Sim. Cada aula de Lua Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.

Todas as aulas deste curso

  1. A biblioteca debug em profundidade
  2. Depuração remota com MobDebug
  3. Criação de perfis com LuaProfiler
  4. Cobertura de código e instrumentação de testes
← Voltar para Lua Academy