English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Depuração do Lua (Debug)

O Lua oferece a biblioteca debug para fornecer a capacidade de criar nosso depurador personalizado. O Lua em si não possui depurador integrado, mas muitos desenvolvedores compartilham seu código de depurador Lua.

A biblioteca debug do Lua contém as seguintes funções:

NúmeroMétodos e Usos
1.debug():

Entrar em um modo de interação do usuário, executar cada string inserida pelo usuário. Com comandos simples e outras configurações de depuração, o usuário pode revisar variáveis globais e locais, alterar valores de variáveis, calcular expressões, etc.
Inserir uma linha de string que contém apenas 'cont' para encerrar essa função, permitindo que o chamador continue a execução.

2.getfenv(object):

Retorna as variáveis de ambiente do objeto.

3.gethook(optional thread):

Retorna três valores que representam as configurações do gatilho de thread: função gatilho atual, máscara gatilho atual, contagem gatilho atual

4.getinfo ([thread,] f [, what]):

Retorna uma tabela com informações sobre uma função. Você pode fornecer diretamente a função ou usar um número f para representar a função. O número f representa a função na camada correspondente ao nível da pilha de chamadas na thread especificada: 0 camada representa a função atual (getinfo próprio); 1 A camada representa a função que chamou getinfo (a menos que seja uma chamada final, neste caso não é contada na pilha); etc. Se f for um número maior que o número de funções ativas, getinfo retorna nil.

5.debug.getlocal ([thread,] f, local):

Esta função retorna o nome e o valor da variável local com índice na camada f da pilha. Esta função não é usada apenas para acessar variáveis locais explicitamente definidas, mas também para parâmetros de forma, variáveis temporárias, etc.

6.getmetatable(value):

Empilha a tabela de metadados do valor apontado pelo índice fornecido na pilha. Se o índice for inválido ou se esse valor não tiver uma tabela de metadados, a função retorna 0 e não empilha nada na pilha.

7.getregistry():

Retorna o registro da tabela, que é uma tabela pré-definida, que pode ser usada para salvar qualquer valor que o código C queira salvar no Lua.

8.getupvalue (f, up)

Esta função retorna o nome e o valor do up-valor da função f na posição up. Se essa função não tiver aquele up-valor, retorna nil.
O nome de variável que começa com '(' (abre parênteses) representa uma variável sem nome (bloco de código removido das informações de depuração).

10.sethook ([thread,] hook, mask [, count]):

Configure uma função como função gatilho. A string 'mask' e o número 'count' determinam quando o gatilho será acionado. A máscara é uma string composta pelos seguintes caracteres, cada um com seu significado:

  • 'c': Cada vez que o Lua chama uma função, chama o gatilho;

  • 'r': Cada vez que o Lua retorna de uma função, chama o gatilho;

  • 'l': Cada vez que o Lua entra em uma nova linha, chama o gatilho.

11.setlocal ([thread,] level, local, value):

Esta função atribui o value ao nível level da função local na pilha. Se não houver essa variável, a função retorna nil. Se o level estiver fora dos limites, lança um erro.

12.setmetatable (value, table):

Define a metatabela do value como table (pode ser nil). Retorna value.

13.setupvalue (f, up, value):

Esta função define o value como o up-valor da função f. Se a função não tiver esse up-valor, retorna nil. Caso contrário, retorna o nome do up-valor.

14.traceback ([thread,] [message [, level]]):

Se o message existir e não for uma string ou nil, a função não faz nada e retorna message diretamente. Caso contrário, ela retorna as informações de traceback da pilha de chamadas. A string opcional message é adicionada no início das informações de traceback da pilha de chamadas. O número opcional level indica a partir de qual camada da pilha começar a traceback (o padrão é 1 ou seja, onde é chamado traceback).

A tabela acima lista as funções de depuração que usamos frequentemente, e em seguida, podemos ver alguns exemplos simples:

function myfunction()
print(debug.traceback("traceback da pilha"))
print(debug.getinfo(1))
print("Fim do traceback da pilha")
        return 10
fim
myfunction()
print(debug.getinfo(1))

A execução do código acima resulta na seguinte saída:

traceback da pilha
traceback da pilha:
    test2.lua:2: em função 'myfunction'
    test2.lua:8: em main chunk
    [C]: ?
tabela: 0054C6C8
Fim do traceback da pilha

Neste exemplo, usamos as funções traceback e getinfo da biblioteca debug, onde a função getinfo é usada para retornar uma tabela de informações de função.

Outro exemplo

Nós frequentemente precisamos depurar variáveis locais dentro de funções. Podemos usar a função getupvalue para configurar essas variáveis locais. O exemplo a seguir é o seguinte:

função newCounter()
  local n = 0
  local k = 0
  retornar função()
    k = n
    n = n + 1
    retornar n
    fim
fim
counter = newCounter()
print(counter())
print(counter())
local i = 1
repetir
  name, val = debug.getupvalue(counter, i)
  se(name então
    print("index", i, name, "=", val)
        se(name == "n") então
                debug.setupvalue(counter,2,10)
        fim
    i = i + 1
  fim -- se
até não name
print(counter())

A execução do código acima resulta na seguinte saída:

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

No exemplo acima, o contador é incrementado automaticamente em cada chamada1.No exemplo, usamos a função getupvalue para visualizar o estado atual da variável local. Podemos configurar a variável local para um novo valor. No exemplo, antes de configurar, o valor de n é 2, usando a função setupvalue para configurá-la como 10.Agora chamamos a função, após a execução, a saída é 11 em vez de 3.

Tipo de Depuração

  • Depuração de Linha de Comando

  • Depuração de Interface Gráfica

Debuggers de linha de comando incluem: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.

Os debuggers de interface gráfica incluem: SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.