Средства отладки
Пользователи Tarantool могут воспользоваться преимуществами встроенных средств отладки, которые составляют часть:
Библиотека debug
предоставляет интерфейс для отладки Lua-программ. Все функции этой библиотеки содержатся в таблице debug
. В функциях для работы с потоками есть дополнительный первый параметр, в котором указывается необходимый поток. По умолчанию, это всегда текущий поток.
Примечание
Библиотеку следует использовать только для отладки и профилирования, а не в качестве программного средства, поскольку данные функции выполняются слишком долго. Кроме того, некоторые из этих функций могут привести к нарушению работы безопасного в других отношениях кода.
Ниже приведен перечень всех функций библиотеки debug
.
Имя | Назначение |
---|---|
debug.debug() | Вход в интерактивный режим |
debug.getfenv() | Получение среды объекта |
debug.gethook() | Получение текущих настроек ловушки потока |
debug.getinfo() | Получение информации о функции |
debug.getlocal() | Получение имени и значения локальной переменной |
debug.getmetatable() | Получение метатаблицы объекта |
debug.getregistry() | Получение таблицы реестра |
debug.getupvalue() | Получение имени и значения сопоставляющего значения |
debug.setfenv() | Определение среды объекта |
debug.sethook() | Определение данной функции в качестве ловушки |
debug.setlocal() | Присваивание значения локальной переменной |
debug.setmetatable() | Определение метатаблицы объекта |
debug.setupvalue() | Присваивание значения сопоставляющему значению |
debug.sourcedir() | Get the source directory name |
debug.sourcefile() | Get the source file name |
debug.traceback() | Получение обратной трассировки стека вызовов |
-
debug.
debug
()¶ Вход в интерактивный режим и выполнение каждой строки, которую печатает пользователь. Пользователь может, в частности, проверять глобальные и локальные переменные, изменять их значения и вычислять выражения.
Введите
cont
для выхода из данной функции, чтобы вызывающий клиент мог продолжить выполнение.Примечание
Команды для
debug.debug()
не вложены лексически в какую-либо функцию, поэтому у них нет прямого доступа к локальным переменным.
-
debug.
getfenv
(object)¶ Параметры: - object – объект, для которого будет получена среда
возвращает: среда объекта
object
-
debug.
gethook
([thread])¶ возвращает: текущие настройки ловушки потока
thread
в виде трех значений:- текущая функция-ловушка
- текущая маска ловушки
- текущий счетчик ловушки, как определяет функция
debug.sethook()
-
debug.
getinfo
([thread, ]function[, what])¶ Параметры: - function – функция, по которой будет получена информация
- what (
string
) – какую информацию о функцииfunction
вернуть
возвращает: таблица с информацией о функции
function
Можно передать функцию
function
напрямую или же передать число, которое указывает на функцию, выполняемую на уровнеfunction
стека вызовов данного потокаthread
: уровень 0 – это текущая функция (сама функцияgetinfo()
), уровень 1 – это функция, которая вызвалаgetinfo()
, и т.д. Если для функцииfunction
указано число больше числа активных функций,getinfo()
вернетnil
.По умолчанию,
what
– это вся доступная информация, кроме таблицы допустимых строк. Если задать опциюf
, добавится поле под названиемfunc
с самой функцией. Если задать опциюL
, добавится поле под названиемactivelines
с таблицей доступных строк.
-
debug.
getlocal
([thread, ]level, local)¶ Параметры: - level (
number
) – уровень стека - local (
number
) – индекс локальной переменной
возвращает: имя и значение локальной переменной с индексом
local
функции на уровнеlevel
стека илиnil
, если нет локальной переменной с указанным индексом; появится ошибка, если уровеньlevel
вне диапазонаПримечание
Можно вызвать
debug.getinfo()
для проверки доступности уровня.- level (
-
debug.
getmetatable
(object)¶ Параметры: - object – объект, для которого будет получена метатаблица
возвращает: метатаблица объекта
object
илиnil
, если метатаблица отсутствует
-
debug.
getregistry
()¶ возвращает: таблица реестра
-
debug.
getupvalue
(func, up)¶ Параметры: - func (
function
) – функция, для которой будет получено сопоставляющее значение - up (
number
) – индекс сопоставляющего значения функции
возвращает: имя и значение сопоставляющего значения с индексом
up
функцииfunc
илиnil
, если нет сопоставляющего значения в пределах заданного индекса- func (
-
debug.
setfenv
(object, table)¶ Определение среды объекта
object
для таблицыtable
.Параметры: - object – объект, среда которого будет изменена
- table (
table
) – таблица для определения среды объекта
возвращает: объект
object
-
debug.
sethook
([thread, ]hook, mask[, count])¶ Определение данной функции в качестве ловушки. При вызове без аргументов ловушка отключается.
Параметры: - hook (
function
) – функция, которая будет определена в качестве ловушки - mask (
string
) – описание того, когда будет вызвана ловушкаhook
; может принимать следующие значения: *c
– ловушка``hook`` вызывается каждый раз, когда Lua вызывает функцию *r
– ловушкаhook
вызывается каждый раз, когда Lua возвращается из функции *l
– ловушкаhook
вызывается каждый раз, когда Lua переходит на новую строку кода - count (
number
) – описание того, когда будет вызвана ловушкаhook
; если отличается от нуля, ловушкаhook
вызывается после каждой инструкцииcount
.
- hook (
-
debug.
setlocal
([thread, ]level, local, value)¶ Присвоение значения
value
локальной переменной с индексомlocal
функции на уровнеlevel
стекаПараметры: - level (
number
) – уровень стека - local (
number
) – индекс локальной переменной - value – значение, присваиваемое локальной переменной
возвращает: имя локальной переменной или
nil
, если локальная переменная с заданным индексом отсутствует; возникает ошибка, если уровеньlevel
вне диапазонаПримечание
Можно вызвать
debug.getinfo()
для проверки доступности уровня.- level (
-
debug.
setmetatable
(object, table)¶ Определение метатаблицы объекта
object
для таблицыtable
.Параметры: - object – объект, метатаблица которого будет изменена
- table (
table
) – таблица для определения метатаблицы объекта
-
debug.
setupvalue
(func, up, value)¶ Присвоение значения
value
сопоставляющему значению с индексомup
функцииfunc
.Параметры: - func (
function
) – функция, для которой будет определено сопоставляющее значение - up (
number
) – индекс сопоставляющего значения функции - value – значение, присваиваемое сопоставляющему значению функции
возвращает: имя сопоставляющего значения или
nil
, если сопоставляющее значение с данным индексом отсутствует- func (
-
debug.
sourcedir
([level])¶ Параметры: - level (
number
) – the level of the call stack which should contain the path (default is 2)
возвращает: a string with the relative path to the source file directory
Instead of
debug.sourcedir()
one can saydebug.__dir__
which means the same thing.Determining the real path to a directory is only possible if the function was defined in a Lua file (this restriction may not apply for loadstring() since Lua will store the entire string in debug info).
If
debug.sourcedir()
is part of areturn
argument, then it should be inside parentheses:return (debug.sourcedir())
.- level (
-
debug.
sourcefile
([level])¶ Параметры: - level (
number
) – the level of the call stack which should contain the path (default is 2)
возвращает: a string with the relative path to the source file
Instead of
debug.sourcefile()
one can saydebug.__file__
which means the same thing.Determining the real path to a file is only possible if the function was defined in a Lua file (this restriction may not apply to
loadstring()
since Lua will store the entire string in debug info).If
debug.sourcefile()
is part of areturn
argument, then it should be inside parentheses:return (debug.sourcefile())
.- level (
-
debug.
traceback
([thread, ][message][, level])¶ Параметры: - message (
string
) – необязательное сообщение, добавленное к началу обратной трассировки - level (
number
) – указывает на каком уровне начинать обратную трассировку (по умолчанию, 1)
возвращает: строка с обратной трассировкой стека вызовов
- message (
Debug example:
Make a file in the /tmp directory named example.lua, containing:
function w()
print(debug.sourcedir())
print(debug.sourcefile())
print(debug.traceback())
print(debug.getinfo(1)['currentline'])
end
w()
Execute tarantool /tmp/example.lua
. Expect to see this:
/tmp
/tmp/example.lua
stack traceback:
/tmp/example.lua:4: in function 'w'
/tmp/example.lua:7: in main chunk
5