Библиотека debug
Исследуйте трассировки стека, локальные переменные и внешние значения с помощью библиотеки debug.
«Библиотека debug» — бесплатный урок Lua Academy на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Lua Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Lua Academy содержит 4 уроков всего.
Что такое библиотека debug
Библиотека debug предоставляет низкоуровневый доступ к внутренним механизмам Lua: кадрам стека, локальным переменным, переменным верхнего уровня, перехватчикам и состоянию coroutine. Используйте её для отладки, а не в рабочей логике программы.
debug.traceback
debug.traceback(msg, level) возвращает строку со стеком вызовов. Обычно её передают в xpcall как обработчик ошибок.
local ok, err = xpcall(function()
error("something went wrong")
end, debug.traceback)
print(err)debug.getinfo
debug.getinfo(fn, what) возвращает таблицу с информацией о функции: именем, исходным кодом, строкой определения и т. д.
local function foo() end
local info = debug.getinfo(foo, "Sl")
print(info.source, info.linedefined)Просмотр уровня стека
Передайте целое число в debug.getinfo, чтобы проверить определённый кадр стека. Уровень 1 — текущая функция, уровень 2 — вызывающая функция.
local function where()
local info = debug.getinfo(2, "Sl")
return info.short_src .. ":" .. info.currentline
end
print(where())debug.getlocal и debug.setlocal
debug.getlocal(level, n) возвращает имя и значение n-й локальной переменной в кадре стека.
local function example()
local x = 42
print(debug.getlocal(1, 1)) -- x 42
end
example()debug.getupvalue и debug.setupvalue
Проверяйте и изменяйте переменные верхнего уровня функции. getupvalue(fn, n) возвращает имя и значение.
local x = 10
local function f() return x end
print(debug.getupvalue(f, 1)) -- x 10
debug.setupvalue(f, 1, 99)
print(f()) -- 99debug.sethook
debug.sethook(fn, mask, count) устанавливает перехватчик, вызываемый при событиях: "c" (вызов), "r" (возврат), "l" (строка) или после каждых N инструкций.
local calls = 0
debug.sethook(function() calls = calls + 1 end, "c")
-- ... run some code ...
debug.sethook() -- remove hook
print("calls:", calls)debug.getmetatable
debug.getmetatable(obj) получает метатаблицу даже тогда, когда доступ к getmetatable заблокирован полем __metatable.
debug.upvalueid и upvaluejoin
debug.upvalueid(fn, n) возвращает уникальный идентификатор переменной верхнего уровня. debug.upvaluejoin(f1,n1,f2,n2) заставляет их совместно использовать одну ячейку.
Осторожно: риски библиотеки debug
Библиотека debug может нарушить инкапсуляцию и инварианты. Никогда не используйте её в рабочем коде. Оставьте её для тестирования, профилирования и инструментов разработки.
debug.traceback в xpcall
Наиболее распространённый безопасный для рабочего кода способ использования debug — передать debug.traceback в xpcall как обработчик ошибок для получения подробных сообщений об ошибках.
Вопрос о библиотеке debug
Какая функция debug безопасна и обычно используется для обработки ошибок в рабочем коде?
Итоги: библиотека debug
Библиотека debug открывает доступ к кадрам стека, локальным переменным, переменным верхнего уровня и перехватчикам. Используйте debug.traceback с xpcall для получения подробной информации об ошибках; остальные средства рассматривайте как инструменты интроспекции только для разработчиков.
Изучай Lua с ИИ-репетитором — бесплатно
Пиши и запускай код прямо в браузере, получай мгновенную помощь от ИИ-репетитора 24/7 и продолжи учиться на сайте или в приложении.
- Курсы
- 40
- Уроки
- 159
Часто задаваемые вопросы
Урок «Библиотека debug» бесплатный?
Да — полный текст урока «Библиотека debug» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Lua Academy, подпишись на CoddyKit PRO. Курс Lua Academy содержит 4 уроков всего.
Чему я научусь в уроке «Библиотека debug»?
Исследуйте трассировки стека, локальные переменные и внешние значения с помощью библиотеки debug. Ты практикуешь Lua Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать Lua Academy?
Предыдущий опыт не требуется. Lua Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Библиотека debug»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке Lua Academy?
Да. Каждый урок Lua Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.