English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
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úmero | Mé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. |
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. |
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:
|
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.
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.
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.