Найти в Дзене

«Отладка Lua‑скриптов: типичные ошибки и как их чинить».

Оглавление

Формат сообщения об ошибке

Первая строка ошибки содержит три ключевых элемента:

  1. Путь к файлу, вызывающему ошибку.
  2. Номер строки, где произошла ошибка.
  3. Описание самой ошибки.

Пример:

[ERROR] addons/my_addon/lua/autorun/server/sv_my_addon_autorun.lua:2: attempt to call global 'Print' (a nil value)

Здесь: файл sv_my_addon_autorun.lua, строка 2, ошибка — попытка вызвать несуществующую функцию Print.

Типичные ошибки и способы их исправления

1. attempt to call global '?' (a nil value)

  • Причина: вызов несуществующей функции или опечатка в имени.
  • Пример: Print("Hello") вместо print("Hello").
  • Исправление:
    проверьте правильность написания имени функции;
    убедитесь, что функция существует и определена в нужной области видимости.

2. attempt to perform arithmetic on global '?' (a nil value)

  • Причина: арифметическая операция с неопределённой или нечисловой переменной.
  • Пример:lualocal x
    print(x + 5) -- x = nil
  • Исправление:
    инициализируйте переменные перед использованием;
    проверяйте тип данных: if type(var) == "number" then ....

3. attempt to index global 'varname' (a nil value)

  • Причина: обращение к полю таблицы, которая не определена.
  • Пример: print(myTable.key) при myTable = nil.
  • Исправление:
    убедитесь, что таблица инициализирована: local myTable = {};
    проверяйте на nil перед обращением: if myTable then ....

4. malformed number near 'number'

  • Причина: некорректное число в коде (например, 1.2.3, 2f).
  • Исправление:
    используйте правильный формат чисел: 1.23;
    храните IP‑адреса и подобные данные в виде строк.

5. unexpected symbol near 'symbol'

  • Причина: синтаксическая ошибка (незакрытые скобки, пропущенные then и т. д.).
  • Пример: if x > 0 print("OK") end (пропущен then).
  • Исправление:
    проверьте синтаксис конструкции;
    убедитесь, что все скобки и блоки (if/end, function/end) закрыты.

6. 'symbol1' expected near 'symbol2'

  • Причина: ожидался один символ, но найден другой (часто из‑за пропущенных запятых или скобок).
  • Пример: {1, 2 3} (пропущена запятая).
  • Исправление:
    добавьте недостающий символ (запятую, скобку и т. п.);
    проверьте отступы и структуру кода.

7. Couldn't include file 'file' - File not found

  • Причина: попытка подключить несуществующий файл.
  • Исправление:
    проверьте путь к файлу;
    убедитесь, что файл существует и доступен;
    перезапустите сервер, если файл добавлен во время работы.

8. bad argument #1 to 'function' (... expected, got ...)

  • Причина: неверный тип аргумента для функции.
  • Примеры:
    pairs(nil) — ожидается таблица, получено nil;
    tostring(5 + "abc") — операция между числом и строкой.
  • Исправление:
    проверяйте типы аргументов перед вызовом: assert(type(arg) == "table", "Expected table")
    используйте tostring()/tonumber() для преобразования.

9. Ошибки времени выполнения (runtime)

  • Причины:
    бесконечный цикл (while true do ... без break);
    рекурсия без условия выхода;
    превышение лимита времени выполнения.
  • Исправление:
    добавляйте счётчики и условия выхода в циклы;
    ограничивайте глубину рекурсии;
    разбивайте тяжёлые операции на части.

Инструменты и методы отладки

1. print() — простой вывод значений

Используйте для отслеживания значений переменных и хода выполнения:

lua

local x = 10
print("Значение x:", x)

2. assert() — проверка условий

Прерывает выполнение с ошибкой, если условие ложно:

lua

function divide(a, b)
assert(b ~= 0, "Деление на ноль!")
return a / b
end

3. error() — принудительное создание ошибки

Полезно для отладки и обработки исключительных ситуаций:

lua

if not player then
error("Игрок не найден!")
end

4. pcall() — безопасный вызов функций

Позволяет перехватить ошибку без остановки скрипта:

lua

local success, result = pcall(function()
return riskyOperation()
end)
if not success then
print("Ошибка:", result)
end

5. Внешние инструменты

  • ZeroBrane Studio — IDE с интегрированным отладчиком для Lua.
  • MobDebug — удалённый отладчик.
  • LuaJIT’s DynASM — инструмент для анализа байт‑кода.

Чек‑лист отладки

  1. Проверьте сообщение об ошибке:
    найдите файл и строку с ошибкой;
    проанализируйте описание ошибки.
  2. Используйте print():
    выводите значения переменных в ключевых точках;
    отслеживайте поток выполнения (например, «Функция X вызвана»).
  3. Добавьте проверки:
    assert() для критических условий;
    проверки на nil перед использованием переменных.
  4. Упростите код:
    изолируйте проблемный участок;
    тестируйте его отдельно.
  5. Проверьте типы данных:
    используйте type(var) для диагностики;
    убедитесь, что аргументы функций корректны.
  6. Анализируйте логи:
    ищите цепочки вызовов (трассировку);
    обращайте внимание на цвет сообщений (синий — сервер, жёлтый — клиент).
  7. Протестируйте граничные случаи:
    пустые таблицы;
    нулевые значения;
    крайние условия циклов.

Практические советы

  • Именовайте переменные понятно: playerHealth вместо ph.
  • Разбивайте код на функции: маленькие блоки легче отлаживать.
  • Добавляйте комментарии: поясняйте сложную логику.
  • Сохраняйте резервные копии: перед крупными изменениями.
  • Тестируйте постепенно: вносите одно изменение за раз.
  • Используйте IDE: подсветка синтаксиса и автодополнение снижают число опечаток.
  • Изучайте документацию: проверяйте сигнатуры функций и ожидаемые типы аргументов.

Если хотите, могу разобрать конкретный пример ошибки или помочь с отладкой вашего скрипта!