Lua Academy · Урок

Библиотека debug

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

Урок 4 из 413 шагов

«Библиотека 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())  -- 99

debug.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 — локальная установка не требуется.

Все уроки этого курса

  1. Функции библиотеки math
  2. Функции библиотеки table
  3. Библиотеки os и io
  4. Библиотека debug
← Назад к Lua Academy