Lua - Depuração

Lua fornece uma biblioteca de depuração, que fornece todas as funções primitivas para criarmos nosso próprio depurador. Mesmo assim, não há um depurador para Lua embutido, temos muitos depuradores para Lua, criados por vários desenvolvedores, muitos deles sendo de código aberto.

As funções disponíveis na biblioteca de depuração Lua estão listadas na tabela a seguir junto com seus usos.

Sr. Não. Método e Objetivo
1

debug()

Entra no modo interativo para depuração, que permanece ativo até digitarmos apenas cont em uma linha e pressionarmos enter. O usuário pode inspecionar variáveis ​​durante este modo usando outras funções.

2

getfenv(object)

Retorna o ambiente do objeto.

3

gethook(optional thread)

Retorna as configurações de gancho atuais do thread, como três valores - a função de gancho atual, a máscara de gancho atual e a contagem de gancho atual.

4

getinfo(optional thread, function or stack level, optional flag)

Retorna uma tabela com informações sobre uma função. Você pode fornecer a função diretamente ou um número como o valor da função, o que significa que a função em execução no nível function da pilha de chamadas do thread fornecido - nível 0 é a função atual (getinfo propriamente dito); o nível 1 é a função que chamou getinfo; e assim por diante. Se function for um número maior do que o número de funções ativas, getinfo retornará nil.

5

getlocal(optional thread, stack level, local index)

Retorna o nome e o valor da variável local com índice local da função no nível da pilha. Retorna nulo se não houver variável local com o índice fornecido e gera um erro quando chamado com um nível fora do intervalo.

6

getmetatable(value)

Retorna a metatabela do objeto fornecido ou nil se não tiver uma metatabela.

7

getregistry()

Retorna a tabela de registro, uma tabela predefinida que pode ser usada por qualquer código C para armazenar qualquer valor de Lua que precise armazenar.

8

getupvalue(function, upvalue index)

Esta função retorna o nome e o valor do upvalue com o índice up da função func. A função retorna nil se não houver upvalue com o índice fornecido.

9

setfenv(function or thread or userdata, environment table)

Define o ambiente do objeto fornecido para a tabela fornecida. Retorna o objeto.

10

sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count)

Define a função dada como um gancho. A máscara de string e o número de contagem descrevem quando o gancho será chamado. Aqui, c, r e l são chamados sempre que Lua chama, retorna e insere cada linha de código em uma função, respectivamente.

11

setlocal(optional thread, stack level, local index, value)

Atribui o valor à variável local com índice local da função no nível da pilha. A função retorna nil se não houver uma variável local com o índice fornecido e gera um erro quando chamada com um nível fora do intervalo. Caso contrário, ele retorna o nome da variável local.

12

setmetatable(value, metatable)

Define a meta-tabela para o objeto fornecido na tabela fornecida (que pode ser nula).

13

setupvalue(function, upvalue index, value)

Esta função atribui o valor ao upvalue com o índice up da função func. A função retorna nil se não houver upvalue com o índice fornecido. Caso contrário, ele retorna o nome do upvalue.

14

traceback(optional thread, optional message string, optional level argument)

Cria uma mensagem de erro estendida com um traceback.

A lista acima é a lista completa de funções de depuração em Lua e frequentemente usamos uma biblioteca que usa as funções acima e fornece depuração mais fácil. Usar essas funções e criar nosso próprio depurador é bastante complicado e não é preferível. De qualquer forma, veremos um exemplo de uso simples de funções de depuração.

function myfunction ()
   print(debug.traceback("Stack trace"))
   print(debug.getinfo(1))
   print("Stack trace end")

   return 10
end

myfunction ()
print(debug.getinfo(1))

Quando executarmos o programa acima, obteremos o rastreamento de pilha conforme mostrado abaixo.

Stack trace
stack traceback:
	test2.lua:2: in function 'myfunction'
	test2.lua:8: in main chunk
	[C]: ?
table: 0054C6C8
Stack trace end

No programa de exemplo acima, o rastreamento de pilha é impresso usando a função debug.trace disponível na biblioteca de depuração. O debug.getinfo obtém a tabela atual da função.

Depuração - Exemplo

Freqüentemente, precisamos saber as variáveis ​​locais de uma função para depuração. Para esse propósito, podemos usar getupvalue e para definir essas variáveis ​​locais, usamos setupvalue. Um exemplo simples para isso é mostrado abaixo.

function newCounter ()
   local n = 0
   local k = 0
	
   return function ()
      k = n
      n = n + 1
      return n
   end
	
end

counter = newCounter ()

print(counter())
print(counter())

local i = 1

repeat
   name, val = debug.getupvalue(counter, i)
	
   if name then
      print ("index", i, name, "=", val)
		
      if(name == "n") then
         debug.setupvalue (counter,2,10)
      end
		
      i = i + 1
   end -- if
	
until not name

print(counter())

Quando executarmos o programa acima, obteremos a seguinte saída.

1
2
index	1	k	=	1
index	2	n	=	2
11

Neste exemplo, o contador é atualizado em um cada vez que é chamado. Podemos ver o estado atual da variável local usando a função getupvalue. Em seguida, definimos a variável local com um novo valor. Aqui, n é 2 antes que a operação de definição seja chamada. Usando a função setupvalue, ele é atualizado para 10. Agora, quando chamarmos a função do contador, ele retornará 11 em vez de 3.

Tipos de depuração

  • Depuração de linha de comando
  • Depuração gráfica

Depuração de linha de comando

A depuração de linha de comando é o tipo de depuração que usa a linha de comando para depurar com a ajuda de comandos e instruções de impressão. Existem muitos depuradores de linha de comando disponíveis para Lua, dos quais alguns estão listados abaixo.

  • RemDebug- RemDebug é um depurador remoto para Lua 5.0 e 5.1. Ele permite que você controle a execução de outro programa Lua remotamente, definindo pontos de interrupção e inspecionando o estado atual do programa. RemDebug também pode depurar scripts CGILua.

  • clidebugger- Um depurador de interface de linha de comando simples para Lua 5.1 escrito em Lua pura. Não depende de nada além das bibliotecas Lua 5.1 padrão. Foi inspirado no RemDebug, mas não possui instalações remotas.

  • ctrace - Uma ferramenta para rastrear chamadas de API de Lua.

  • xdbLua - Um depurador simples de linha de comando Lua para a plataforma Windows.

  • LuaInterface - Debugger- Este projeto é uma extensão do depurador para LuaInterface. Ele eleva a interface de depuração construída em Lua a um nível mais alto. A interação com o depurador é feita por eventos e chamadas de método.

  • Rldb- Este é um depurador Lua remoto via socket, disponível em Windows e Linux. Ele pode oferecer muito mais recursos do que qualquer outro existente.

  • ModDebug - Isso permite controlar a execução de outro programa Lua remotamente, definir pontos de interrupção e inspecionar o estado atual do programa.

Depuração Gráfica

A depuração gráfica está disponível com a ajuda do IDE, onde é fornecida a depuração visual de vários estados, como valores de variáveis, rastreamento de pilha e outras informações relacionadas. Há uma representação visual e controle passo a passo da execução com a ajuda de breakpoints, step into, step over e outros botões no IDE.

Existem vários depuradores gráficos para Lua e incluem o seguinte.

  • SciTE - O IDE do Windows padrão para Lua fornece vários recursos de depuração como pontos de interrupção, etapa, etapa, etapa, variáveis ​​de observação e assim por diante.

  • Decoda - Este é um depurador gráfico com suporte para depuração remota.

  • ZeroBrane Studio- Lua IDE com depurador remoto integrado, visão de pilha, visão de relógio, console remoto, analisador estático e muito mais. Funciona com LuaJIT, Love2d, Moai e outros motores Lua; Windows, OSX e Linux. Código aberto.

  • akdebugger - Plugin de Debugger e editor Lua para Eclipse.

  • luaedit - Isso apresenta depuração remota, depuração local, destaque de sintaxe, lista de propostas de conclusão, mecanismo de proposição de parâmetros, gerenciamento de breakpoint avançado (incluindo sistema de condição em pontos de interrupção e contagem de ocorrências), lista de funções, lista de variáveis ​​globais e locais, relógios, gerenciamento orientado para solução.