Entendendo a depuração Lua

Depuração Lua , a arte essencial de encontrar e corrigir esses bugs irritantes em seu código Lua! A depuração é uma parte crítica do processo de desenvolvimento, e Lua fornece algumas ferramentas úteis para ajudá-lo a rastrear e eliminar esses erros indescritíveis. A depuração ajuda a identificar e resolver erros, garantindo que o programa funcione conforme o esperado.

Neste tutorial, veremos mais de perto a depuração de Lua , incluindo técnicas de depuração, ferramentas e práticas recomendadas.



Instruções Lua Print()

A técnica de depuração lua mais simples é usar instruções print() para enviar valores e mensagens para o console. Essa técnica pode ser útil para identificar problemas com variáveis , funções e fluxo de controle .

Adicionar uma instrução print() em um ponto específico do código pode permitir que você verifique se uma variável está sendo definida corretamente. Por exemplo:

local x = 5
print("x = ", x) -- Output: x = 5

As instruções Print() também podem ser usadas para rastrear o caminho de execução de uma função:

for i = 1, 5 do
print("i = ", i) -- Output: i = 1, i = 2, i = 3, i = 4, i = 5
end

Biblioteca de Depuração Lua

A biblioteca de depuração Lua fornece uma variedade de funções para depurar seu código.

Ao usar essas funções , você pode inspecionar a pilha de chamadas, definir pontos de interrupção e modificar o comportamento do interpretador Lua.

A biblioteca de depuração contém as seguintes funções úteis:

Palavras-chave de funções Visão geral
debug.debug() Esta função entra em um modo interativo onde você pode executar código Lua e inspecionar variáveis. É útil para depurar problemas complexos em que você precisa percorrer o código e ver o estado das variáveis ​​em cada etapa.
debug.getinfo() Esta função retorna uma tabela contendo informações sobre a função no nível de pilha especificado. Isso pode ser usado para obter informações sobre a função atual ou quaisquer funções de chamada.
debug.getlocal() Esta função retorna o valor de uma variável local na função especificada no nível de pilha especificado. Isso pode ser útil para inspecionar o estado das variáveis ​​em um ponto específico do código.
debug.getupvalue() Esta função retorna o valor de um upvalue na função especificada no nível de pilha especificado. Upvalues ​​são variáveis ​​definidas em uma função pai e usadas em uma função filha.
debug.setlocal() Esta função define o valor de uma variável local na função especificada no nível de pilha especificado. Isso pode ser útil para modificar o estado das variáveis ​​durante a depuração.
debug.setupvalue() Esta função define o valor de um upvalue na função especificada no nível de pilha especificado. Isso pode ser útil para modificar o estado das variáveis ​​durante a depuração.
debug.traceback() Essa função retorna uma string contendo um rastreamento da pilha de chamadas no ponto atual do código. Isso pode ser útil para identificar a localização de erros em seu código.
debug.sethook() Essa função define uma função de gancho que é chamada em vários pontos durante a execução do seu código. Isso pode ser útil para monitorar o estado do seu código e detectar erros.
debug.gethook() Esta função retorna a função de gancho atual e sua máscara. Isso pode ser útil para inspecionar o estado do seu código durante a depuração.
debug.debugger() Esta função inicia um depurador Lua. É uma alternativa para debug.debug() que permite usar um depurador mais poderoso do que o fornecido por Lua.
debug.getfenv() Retorna a tabela de ambiente atual ou a tabela de ambiente de uma função especificada.
debug.getmetatable() Usado para retornar a metatabela de um determinado valor Lua.
debug.getregistry() Esta função é usada para retornar a tabela de registro global.
debug.setfenv() Usado para definir a tabela de ambiente de uma determinada função Lua.

Aqui está um exemplo que utiliza as funções debug.getupvalue() e debug.setupvalue() em Lua:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
-- Define a function with an upvalue
function myfunc()
local x = 10
return function()
return x
end
end
-- Get the closure function from myfunc
local closure = myfunc()
-- Get the name and value of the upvalue
local name, value = debug.getupvalue(closure, 1)
-- Print the name and value of the upvalue
print(name.." = "..value) -- Output: x 10
-- Set the value of the upvalue
debug.setupvalue(closure, 1, 20)
-- Call the closure function and see the new value of x
print(closure()) -- Output: 20
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
O exemplo a seguir faz uso das funções debug.debug() e debug.traceback() em Lua:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
function myfunc()
local x = 10
debug.debug() -- enter interactive mode
print(x) -- this line won't be executed until we exit debug mode
end
myfunc()
function myerror()
error("Oops!")
end
local success, message = xpcall(myerror, debug.traceback)
print(success, message) -- Output: false traceback: myerror:1: Oops!
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
O exemplo abaixo implementa as funções debug.getlocal() e debug.setlocal em Lua:

Example: 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
function myfunc(x)
local y = 20
x = x + y
return x
end
local x = 10
print(myfunc(x)) -- Output: 30
local i = 1
repeat
local name, value = debug.getlocal(1, i)
if name then
print("index", i, name, "=", value)
if name == "x" then
debug.setlocal(1, i, 15)
end
i = i + 1
end
until not name
print(myfunc(x)) -- Output: 35
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

Tipos de Depuração Lua

Existem dois tipos de depuração em Lua:

  1. Depuração de linha de comando.
  2. Depuração gráfica.

Depuração de linha de comando

A depuração de linha de comando em Lua geralmente envolve o uso de um depurador que fornece uma interface de linha de comando para interagir com o programa Lua em execução. A depuração de linha de comando pode ser uma ferramenta poderosa para depurar programas Lua complexos, mas requer alguma experiência com interfaces de linha de comando e conceitos de depuração.

Também pode ser mais lento e complicado do que outros métodos de depuração, principalmente se você precisar depurar um programa em execução em um servidor remoto ou em um ambiente distribuído complexo. Alguns depuradores de linha de comando populares para Lua incluem LuaDB, remdebug e mobdebug.

Depuração Gráfica

A depuração gráfica em Lua envolve o uso de um depurador que fornece uma interface gráfica do usuário (GUI) para interagir com o programa Lua em execução. A depuração gráfica pode ser uma ferramenta poderosa para depurar programas Lua complexos.

Isso é útil se você estiver mais confortável com interfaces gráficas do que com interfaces de linha de comando. Também pode ser mais rápido e conveniente do que outros métodos de depuração. Isso é particularmente verdadeiro se você precisar depurar um programa em execução em uma máquina local ou em um ambiente de desenvolvimento. No entanto, os depuradores gráficos podem consumir mais recursos e podem não ser tão flexíveis ou personalizáveis ​​quanto os depuradores de linha de comando.

Alguns depuradores gráficos populares para Lua incluem ZeroBrane Studio , Decoda e Eclipse com o plug-in Lua Development Tools.


Melhores práticas para depuração Lua

Aqui estão algumas práticas recomendadas para depuração Lua:

  • Ao usar instruções de impressão, use texto descritivo para identificar quais informações estão sendo impressas. Isso torna mais fácil identificar a origem da saída e os valores que estão sendo impressos.
  • Embora os pontos de interrupção sejam uma técnica de depuração eficaz, usá-los em excesso pode retardar a execução do programa e dificultar a identificação da origem dos erros. Use pontos de interrupção com moderação e somente quando necessário.
  • Testar seu código com antecedência e com frequência pode ajudá-lo a identificar erros antes que eles se tornem mais difíceis de corrigir. Escreva casos de teste e use ferramentas de teste automatizadas para garantir que seu código esteja funcionando conforme o esperado.
Nós valorizamos o seu feedback.
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0
+1
0

Assine a nossa newsletter
Digite seu e-mail para receber um resumo semanal de nossos melhores posts. Saber mais!
ícone