English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Lua предоставляет библиотеку debug для создания нашей собственной системы отладки. Lua сам по себе не имеет встроенного отладчика, но многие разработчики делятся своим кодом отладчиков Lua.
Библиотека debug в Lua включает следующие функции:
Номер | Методы и目的 |
---|---|
1. | debug(): Входит в режим взаимодействия пользователя, выполняет каждый введенный пользователем строку. Используя простые команды и другие настройки отладки, пользователь может просматривать глобальные и локальные переменные, изменять значения переменных, вычислять некоторые выражения и т.д. |
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 определяют, когда вызывается хук. Маска представляет собой строку, состоящую из следующих символов, каждый из которых имеет значение:
|
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.