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

Дебаг Lua

Lua предоставляет библиотеку debug для создания нашей собственной системы отладки. Lua сам по себе не имеет встроенного отладчика, но многие разработчики делятся своим кодом отладчиков Lua.

Библиотека debug в 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):

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

7.getregistry():

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

8.getupvalue (f, up)

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

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

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

  • 'c': Когда Lua вызывает функцию, вызывается хук;

  • 'r': Когда Lua возвращается из функции, вызывается хук;

  • 'l': Каждый раз, когда Lua входит в новую строку, вызывается хук.

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

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

12.setmetatable (value, table):

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

13.setupvalue (f, up, value):

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

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

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

В таблице выше перечислены наши常用的 функции отладки,接下来 мы можем увидеть несколько простых примеров:

function myfunction ()
print(debug.traceback("Трассировка стека"))
print(debug.getinfo(1))
print("Конец трассировки стека")
        return 10
end
myfunction ()
print(debug.getinfo(1))

Результат выполнения кода выше:

Трассировка стека
Трассировка стека:
    test2.lua:2: в функции 'myfunction'
    test2.lua:8: в main блоке
    [C]: ?
Таблица: 0054C6C8
Конец трассировки стека

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

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

Мы часто нуждаемся отладить локальные переменные функции. Мы можем использовать функцию getupvalue для установки этих локальных переменных. Пример приведен ниже:

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.