Учебники

Lua — отладка

Lua предоставляет библиотеку отладки, которая предоставляет нам все примитивные функции для создания нашего собственного отладчика. Хотя встроенного отладчика Lua нет, у нас есть много отладчиков для Lua, созданных различными разработчиками, многие из которых являются открытыми.

Функции, доступные в библиотеке отладки Lua, перечислены в следующей таблице вместе с их использованием.

Sr.No. Метод и цель
1

отладки ()

Переходит в интерактивный режим отладки, который остается активным до тех пор, пока мы не введем только строку в строке и не нажмем клавишу ввода Пользователь может проверять переменные в этом режиме, используя другие функции.

2

getfenv (объект)

Возвращает среду объекта.

3

gethook (необязательная тема)

Возвращает текущие настройки ловушек потока в виде трех значений — текущей функции ловушек, текущей маски ловушек и текущего счетчика ловушек.

4

getinfo (необязательный поток, функция или уровень стека, необязательный флаг)

Возвращает таблицу с информацией о функции. Вы можете передать функцию напрямую или указать число в качестве значения функции, что означает, что функция выполняется на уровне функции стека вызовов данного потока — уровень 0 является текущей функцией (сама getinfo); уровень 1 — это функция, которая вызвала getinfo; и так далее. Если функция на число больше, чем количество активных функций, getinfo возвращает nil.

5

getlocal (необязательный поток, уровень стека, локальный индекс)

Возвращает имя и значение локальной переменной с индексом local функции на уровне стека. Возвращает nil, если локальная переменная с указанным индексом отсутствует, и выдает ошибку при вызове с уровнем вне диапазона.

6

GetMetaTable (значение)

Возвращает метатабельность данного объекта или ноль, если у него нет метатаблицы.

7

getregistry ()

Возвращает таблицу реестра, предопределенную таблицу, которая может использоваться любым кодом C для хранения любого значения Lua, которое необходимо сохранить.

8

getupvalue (функция, индекс upvalue)

Эта функция возвращает имя и значение upvalue с индексом вверх функции func. Функция возвращает nil, если нет никакого значения с данным индексом.

9

setfenv (функция или поток или пользовательские данные, таблица окружения)

Устанавливает среду данного объекта в данную таблицу. Возвращает объект.

10

sethook (необязательный поток, функция ловушки, строка маски крюка с «c» и / или «r» и / или «l», необязательный счетчик команд)

Устанавливает данную функцию как хук. Строковая маска и счетчик чисел описывают, когда будет вызываться ловушка. Здесь c, r и l вызываются каждый раз, когда Lua вызывает, возвращает и вводит каждую строку кода в функцию соответственно.

11

setlocal (необязательный поток, уровень стека, локальный индекс, значение)

Назначает значение локальной переменной с индексом local функции на уровне стека. Функция возвращает nil, если нет локальной переменной с данным индексом, и выдает ошибку при вызове с уровнем вне диапазона. В противном случае он возвращает имя локальной переменной.

12

setmetatable (значение, метатабельный)

Устанавливает метатабельность для данного объекта в данной таблице (которая может быть ноль).

13

setupvalue (функция, индекс upvalue, значение)

Эта функция присваивает значение повышающему значению с индексом вверх функции func. Функция возвращает nil, если нет никакого значения с данным индексом. В противном случае он возвращает имя upvalue.

14

traceback (необязательный поток, необязательная строка сообщения, необязательный аргумент уровня)

Создает расширенное сообщение об ошибке с трассировкой.

отладки ()

Переходит в интерактивный режим отладки, который остается активным до тех пор, пока мы не введем только строку в строке и не нажмем клавишу ввода Пользователь может проверять переменные в этом режиме, используя другие функции.

getfenv (объект)

Возвращает среду объекта.

gethook (необязательная тема)

Возвращает текущие настройки ловушек потока в виде трех значений — текущей функции ловушек, текущей маски ловушек и текущего счетчика ловушек.

getinfo (необязательный поток, функция или уровень стека, необязательный флаг)

Возвращает таблицу с информацией о функции. Вы можете передать функцию напрямую или указать число в качестве значения функции, что означает, что функция выполняется на уровне функции стека вызовов данного потока — уровень 0 является текущей функцией (сама getinfo); уровень 1 — это функция, которая вызвала getinfo; и так далее. Если функция на число больше, чем количество активных функций, getinfo возвращает nil.

getlocal (необязательный поток, уровень стека, локальный индекс)

Возвращает имя и значение локальной переменной с индексом local функции на уровне стека. Возвращает nil, если локальная переменная с указанным индексом отсутствует, и выдает ошибку при вызове с уровнем вне диапазона.

GetMetaTable (значение)

Возвращает метатабельность данного объекта или ноль, если у него нет метатаблицы.

getregistry ()

Возвращает таблицу реестра, предопределенную таблицу, которая может использоваться любым кодом C для хранения любого значения Lua, которое необходимо сохранить.

getupvalue (функция, индекс upvalue)

Эта функция возвращает имя и значение upvalue с индексом вверх функции func. Функция возвращает nil, если нет никакого значения с данным индексом.

setfenv (функция или поток или пользовательские данные, таблица окружения)

Устанавливает среду данного объекта в данную таблицу. Возвращает объект.

sethook (необязательный поток, функция ловушки, строка маски крюка с «c» и / или «r» и / или «l», необязательный счетчик команд)

Устанавливает данную функцию как хук. Строковая маска и счетчик чисел описывают, когда будет вызываться ловушка. Здесь c, r и l вызываются каждый раз, когда Lua вызывает, возвращает и вводит каждую строку кода в функцию соответственно.

setlocal (необязательный поток, уровень стека, локальный индекс, значение)

Назначает значение локальной переменной с индексом local функции на уровне стека. Функция возвращает nil, если нет локальной переменной с данным индексом, и выдает ошибку при вызове с уровнем вне диапазона. В противном случае он возвращает имя локальной переменной.

setmetatable (значение, метатабельный)

Устанавливает метатабельность для данного объекта в данной таблице (которая может быть ноль).

setupvalue (функция, индекс upvalue, значение)

Эта функция присваивает значение повышающему значению с индексом вверх функции func. Функция возвращает nil, если нет никакого значения с данным индексом. В противном случае он возвращает имя upvalue.

traceback (необязательный поток, необязательная строка сообщения, необязательный аргумент уровня)

Создает расширенное сообщение об ошибке с трассировкой.

Приведенный выше список является полным списком функций отладки в Lua, и мы часто используем библиотеку, которая использует вышеуказанные функции и обеспечивает более простую отладку. Использование этих функций и создание нашего собственного отладчика довольно сложно и не является предпочтительным. В любом случае, мы увидим пример простого использования функций отладки.

Live Demo

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. Простой пример для этого показан ниже.

Live Demo

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 до вызова операции set. Используя функцию 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, устанавливать точки останова и проверять текущее состояние программы.

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 — Это включает в себя удаленную отладку, локальную отладку, подсветку синтаксиса, список предложений завершения, механизм предложения параметров, предварительное управление точками останова (включая систему условий на точках останова и числе обращений), список функций, список глобальных и локальных переменных, наблюдения, управление, ориентированное на решение.