Отладка Lua

Lua предоставляет библиотеку отладки для создания пользовательских отладчиков. Сам Lua не имеет встроенного отладчика, но многие разработчики поделились кодом своих отладчиков Lua.

Библиотека отладки в Lua содержит следующие функции:

Нет.Метод и описание
1.debug():

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

2.getfenv(object):

Возвращает окружение объекта.

3.gethook(optional thread):

Возвращает три значения, представляющие настройки ловушки потока: текущую функцию ловушки, текущую маску ловушки и текущий счётчик ловушки.

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

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

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

Эта функция возвращает имя и значение локальной переменной с индексом local функции на уровне f в стеке. Эта функция используется не только для доступа к явно определённым локальным переменным, но также к формальным параметрам, временным переменным и т. д.

6.getmetatable(value):

Помещает метатаблицу значения, на которое указывает заданный индекс, в стек. Если индекс недействителен или у значения нет метатаблицы, функция возвращает 0 и ничего не помещает в стек.

7.getregistry():

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

8.getupvalue (f, up)

Эта функция возвращает имя и значение upvalue с номером up функции f. Если у функции нет такого upvalue, она возвращает nil.
Имена переменных, начинающиеся с '(' (открывающей круглой скобки), обозначают безымянные переменные (блоки кода с удалённой отладочной информацией).

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

Устанавливает функцию в качестве функции-ловушки. Строка mask и число count определяют, когда будет вызвана ловушка. Строка mask состоит из следующих символов, каждый из которых имеет своё значение:

  • 'c': Всякий раз, когда Lua вызывает функцию, вызывается ловушка;
  • 'r': Всякий раз, когда Lua возвращается из функции, вызывается ловушка;
  • 'l': Всякий раз, когда Lua переходит на новую строку, вызывается ловушка.
11.setlocal ([thread,] level, local, value):

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

12.setmetatable (value, table):

Устанавливает метатаблицу value в table (которая может быть nil). Возвращает value.

13.setupvalue (f, up, value):

Эта функция устанавливает value как up-й upvalue функции f. Если у функции нет такого upvalue, она возвращает nil; в противном случае возвращает имя этого upvalue.

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

Если message присутствует и не является строкой или nil, функция возвращает message напрямую, ничего больше не делая. В противном случае она возвращает информацию трассировки стека вызовов. Необязательная строка message добавляется в начало трассировки стека. Необязательное число level указывает, с какого уровня стека начинать трассировку (по умолчанию 1, т.е. место вызова traceback).

В таблице выше перечислены функции отладки, которые мы обычно используем. Далее мы можем рассмотреть несколько простых примеров:

Пример

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

В приведённом выше примере мы использовали функции traceback и getinfo библиотеки debug. Функция getinfo используется для возврата таблицы с информацией о функции.

Другой пример

Нам часто нужно отлаживать локальные переменные внутри функции. Мы можем использовать функцию 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

В приведённом выше примере счётчик увеличивается на 1 при каждом вызове. В примере мы использовали функцию getupvalue, чтобы просмотреть текущее состояние локальной переменной. Мы можем задать локальной переменной новое значение. В примере перед установкой значение n равно 2. Используя функцию setupvalue, мы установили его в 10. Теперь мы вызываем функцию, и после выполнения вывод равен 11 вместо 3.


Типы отладки

  • Отладка в командной строке
  • Отладка с графическим интерфейсом

Отладчики командной строки включают: RemDebug, clidebugger, ctrace, xdbLua, LuaInterface - Debugger, Rldb, ModDebug.

Графические отладчики включают: SciTE, Decoda, ZeroBrane Studio, akdebugger, luaedit.

Другие расширения