Справочное руководство по языку Lua 5.1 :: 5.9 - Обработка таблиц



5.9 – Библиотека отладки

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

Все функции этой библиотеки описаны в таблице debug. Все функции, которые работают с нитями (thread) имеют опциональный первый параметр, который является нитью, над которой будут производиться действия. По умолчанию всегда используется текущая нить.


debug.debug ()

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

Обратите внимание, что команды для функции debug.debug лексически не вложены ни в какую функцию, т.о. не имеют прямого доступа к локальным переменным.


debug.getfenv (o)

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


debug.gethook ([thread])

Возвращает текущие настройки перехвата (hook settings) нити (thread), как три значения: текущая функция перехвата, текущая маска перехвата, и текущее количество перехватов (hook count) (в соответствии с параметрами, установленными функцией debug.sethook).


debug.getinfo ([thread,] function [, what])

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

Возвращаемая таблица может содержать все поля, возвращаемые lua_getinfo, в соответствии со строкой what, содержащей описание, какие поля должны быть заполнены. Значением по умолчанию для параметра what является значение, соответствующее заполнению всех возможных полей, за исключением таблицы валидных строк. В случае наличия опции 'f' в строке, заполняется поле func, содержащее непосредственно функцию. При наличии опции 'L' заполняется поле activelines с таблицей валидных строк.

Например, выражение debug.getinfo(1,"n").name возвращает имя текущей функции, если подходящее имя может быть найдено, а выражение debug.getinfo(print) возвращает таблицу со всей возможной информацией о функции print.


debug.getlocal ([thread,] level, local)

Данная функция возвращает имя и значение локальной переменной с индексом local функции на уровне level стека. (Первый локальная переменная функции имеет индекс 1, и т.д., вплоть до последней локальной переменной.) Функция возвращает nil если не существует локальной переменной с заданным индексом, и возбуждает ошибку при вызове с параметром level, большем максимально разрешенного. (Вы можете вызвать debug.getinfo для проверки, является ли уровень в стеке разрешенным.)

Переменные, начинающиеся с '(' (открывающей скобки) являются внутренними переманными (переменные циклов, временными переменными, и локальными переменными функций C).


debug.getmetatable (object)

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


debug.getregistry ()

Возвращает таблицу реестра (регистра???) (registry table) (см. §3.5).


debug.getupvalue (func, up)

Данная функция возвращает имя и значение внешней локальной переменной (upvalue) с индексом up функции func. Функция возвращает nil если не существует внешней локальной переменной (upvalue) с заданным индексом.


debug.setfenv (object, table)

Изменяет окружение заданного объекта object на заданное table. Возвращает объект object.


debug.sethook ([thread,] hook, mask [, count])

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

  • "c": функция перехвата вызывается при каждом вызове функции;
  • "r": функция перехвата вызывается при каждом выходе из функции;
  • "l": функция перехвата вызвается при каждом переходе на новую строку кода.

Если параметр a count отличен от нуля, перехват происходит каждые count событий.

При вызове без аргументов, debug.sethook отключает перехват.

When the hook is called, its first parameter is a string describing the event that has triggered its call: "call", "return" (or "tail return"), "line", and "count". For line events, the hook also gets the new line number as its second parameter. Inside a hook, you can call getinfo with level 2 to get more information about the running function (level 0 is the getinfo function, and level 1 is the hook function), unless the event is "tail return". In this case, Lua is only simulating the return, and a call to getinfo will return invalid data.


debug.setlocal ([thread,] level, local, value)

Эта функция присваивает значение value локальной переменной с индексом local функции на уровне level стека. Функция возвращает nil, если не существует переменной с данным индексом, и возбуждает ошибку при вызове с уровнем level, выходящем за границы стека. (Вы можете вызвать getinfo для проверки того, что уровень является верным.) В противном случае, возвращает значение локальной переменной.


debug.setmetatable (object, table)

Изменяет метатаблицу заданного объекта object на таблицу table (которая также может быть nil).


debug.setupvalue (func, up, value)

Данная функция присваивает значение value локальной внешней переменной (upvalue) с индексом up функции func. Функция возвращает nil, если не существует локальной внешней переменной (upvalue) с данным индексом. В противном случае, возвращает имя локальной внешней переменной (upvalue).


debug.traceback ([thread,] [message] [, level])

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