Lua - Отладка
Lua предоставляет библиотеку отладки, которая предоставляет нам все примитивные функции для создания нашего собственного отладчика. Несмотря на то, что нет встроенного отладчика Lua, у нас есть много отладчиков для Lua, созданных различными разработчиками, многие из которых имеют открытый исходный код.
Функции, доступные в библиотеке отладки Lua, перечислены в следующей таблице вместе с их использованием.
Sr. No. | Метод и цель |
---|---|
1 | debug() Переходит в интерактивный режим отладки, который остается активным, пока мы не введем в строку только cont и не нажмем Enter. Пользователь может проверять переменные в этом режиме с помощью других функций. |
2 | getfenv(object) Возвращает окружение объекта. |
3 | gethook(optional thread) Возвращает текущие настройки ловушки потока в виде трех значений - текущая функция ловушки, текущая маска ловушки и текущее количество ловушек. |
4 | getinfo(optional thread, function or stack level, optional flag) Возвращает таблицу с информацией о функции. Вы можете указать функцию напрямую или указать число в качестве значения функции, что означает, что функция работает на уровне функции стека вызовов данного потока - уровень 0 - это текущая функция (сама getinfo); уровень 1 - это функция, которая вызывала getinfo; и так далее. Если function - это число, большее, чем количество активных функций, getinfo возвращает nil. |
5 | getlocal(optional thread, stack level, local index) Возвращает имя и значение локальной переменной с локальным индексом функции на уровне стека. Возвращает nil, если нет локальной переменной с данным индексом, и вызывает ошибку при вызове с уровнем вне допустимого диапазона. |
6 | getmetatable(value) Возвращает метатаблицу данного объекта или nil, если у нее нет метатаблицы. |
7 | getregistry() Возвращает таблицу реестра, предопределенную таблицу, которая может использоваться любым кодом C для хранения любого значения Lua, которое ему нужно сохранить. |
8 | getupvalue(function, upvalue index) Эта функция возвращает имя и значение восходящего значения с индексом вверх функции func. Функция возвращает nil, если нет повышающего значения с данным индексом. |
9 | setfenv(function or thread or userdata, environment table) Устанавливает среду данного объекта в данную таблицу. Возвращает объект. |
10 | sethook(optional thread, hook function, hook mask string with "c" and/or "r" and/or "l", optional instruction count) Устанавливает данную функцию как перехватчик. Маска строки и счетчик чисел описывают, когда будет вызвана ловушка. Здесь c, r и l вызываются каждый раз, когда Lua вызывает, возвращает и вводит каждую строку кода в функции соответственно. |
11 | setlocal(optional thread, stack level, local index, value) Присваивает значение локальной переменной с индексом local функции на уровне стека. Функция возвращает nil, если нет локальной переменной с данным индексом, и вызывает ошибку при вызове с уровнем вне допустимого диапазона. В противном случае он возвращает имя локальной переменной. |
12 | setmetatable(value, metatable) Устанавливает метатаблицу для данного объекта в данную таблицу (которая может быть нулевой). |
13 | setupvalue(function, upvalue index, value) Эта функция присваивает значение upvalue с индексом up функции func. Функция возвращает nil, если нет повышающего значения с данным индексом. В противном случае он возвращает имя повышенного значения. |
14 | traceback(optional thread, optional message string, optional level argument) Создает расширенное сообщение об ошибке с трассировкой. |
Приведенный выше список представляет собой полный список функций отладки в Lua, и мы часто используем библиотеку, которая использует указанные выше функции и обеспечивает более простую отладку. Использование этих функций и создание собственного отладчика довольно сложно и нежелательно. В любом случае мы увидим пример простого использования функций отладки.
function myfunction ()
print(debug.traceback("Stack trace"))
print(debug.getinfo(1))
print("Stack trace end")
return 10
end
myfunction ()
print(debug.getinfo(1))
Когда мы запустим вышеуказанную программу, мы получим трассировку стека, как показано ниже.
Stack trace
stack traceback:
test2.lua:2: in function 'myfunction'
test2.lua:8: in main chunk
[C]: ?
table: 0054C6C8
Stack trace end
В приведенном выше примере программы трассировка стека печатается с помощью функции debug.trace, доступной в библиотеке отладки. Debug.getinfo получает текущую таблицу функции.
Отладка - пример
Нам часто нужно знать локальные переменные функции для отладки. Для этого мы можем использовать getupvalue, а для установки этих локальных переменных - setupvalue. Ниже показан простой пример этого.
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())
Когда мы запустим вышеуказанную программу, мы получим следующий результат.
1
2
index 1 k = 1
index 2 n = 2
11
В этом примере счетчик обновляется на единицу при каждом вызове. Мы можем увидеть текущее состояние локальной переменной с помощью функции getupvalue. Затем мы устанавливаем для локальной переменной новое значение. Здесь n равно 2 до вызова операции установки. Используя функцию setupvalue, он обновляется до 10. Теперь, когда мы вызываем функцию счетчика, она возвращает 11 вместо 3.
Типы отладки
- Отладка командной строки
- Графическая отладка
Командная строка отладки
Отладка из командной строки - это тип отладки, при котором для отладки используется командная строка с помощью команд и операторов печати. Для Lua доступно множество отладчиков командной строки, некоторые из которых перечислены ниже.
RemDebug- RemDebug - удаленный отладчик для Lua 5.0 и 5.1. Он позволяет удаленно управлять выполнением другой программы Lua, устанавливать точки останова и проверять текущее состояние программы. RemDebug также может отлаживать сценарии CGILua.
clidebugger- Простой отладчик интерфейса командной строки для Lua 5.1, написанный на чистом Lua. Он не зависит ни от чего, кроме стандартных библиотек Lua 5.1. Он был вдохновлен RemDebug, но не имеет своих удаленных возможностей.
ctrace - Инструмент для отслеживания вызовов Lua API.
xdbLua - Простой отладчик командной строки Lua для платформы Windows.
LuaInterface - Debugger- Этот проект является расширением отладчика для LuaInterface. Он поднимает встроенный интерфейс отладки Lua на более высокий уровень. Взаимодействие с отладчиком осуществляется посредством событий и вызовов методов.
Rldb- Это удаленный отладчик Lua через сокет, доступный как в Windows, так и в Linux. Он может дать вам гораздо больше возможностей, чем любой существующий.
ModDebug - Это позволяет удаленно контролировать выполнение другой программы Lua, устанавливать точки останова и проверять текущее состояние программы.
Графическая отладка
Графическая отладка доступна с помощью IDE, где вам предоставляется визуальная отладка различных состояний, таких как значения переменных, трассировка стека и другая связанная информация. В среде IDE есть визуальное представление и пошаговое управление выполнением с помощью точек останова, перехода, перехода и других кнопок.
Для Lua существует ряд графических отладчиков, в том числе следующие.
SciTE - Windows IDE по умолчанию для Lua предоставляет несколько средств отладки, таких как точки останова, шаг, шаг, шаг, переменные наблюдения и так далее.
Decoda - Это графический отладчик с поддержкой удаленной отладки.
ZeroBrane Studio- Lua IDE со встроенным удаленным отладчиком, представлением стека, просмотром, удаленной консолью, статическим анализатором и т. Д. Работает с LuaJIT, Love2d, Moai и другими движками Lua; Windows, OSX и Linux. Открытый источник.
akdebugger - Плагин Lua отладчика и редактора для Eclipse.
luaedit - Это включает удаленную отладку, локальную отладку, выделение синтаксиса, список предложений завершения, механизм предложения параметров, расширенное управление точками останова (включая систему условий для точек останова и счетчик попаданий), список функций, список глобальных и локальных переменных, отслеживание, управление, ориентированное на решение.