Как прочитать FiveM SCRIPT ERROR: файл, строка и stack trace
Научитесь читать FiveM SCRIPT ERROR: имя ресурса и путь файла, номер строки, stack trace, F8 против консоли сервера и как добавить prints чтобы найти причину.
Типичная ошибка в консоли:
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to index a nil value (local 'xPlayer')
> handler (@my_script/server/main.lua:42)
> ref (citizen:/scripting/lua/scheduler.lua:...)Это похоже на шум, но каждая часть имеет смысл, и она обычно рассказывает вам ровно где смотреть. Это руководство показывает, как его прочитать, где его найти и что делать, когда его недостаточно.
Первая строка: что, где и почему
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to index a nil value (local 'xPlayer')SCRIPT ERROR:помечает ошибку Lua в скрипте. Скрипт продолжает работать после этого, но код, который не выполнился, остановился на этой строке.@my_script/server/main.lua— это имя ресурса (my_script) и путь файла внутри папки ресурса.:42— это номер строки в этом файле.- Остальное — это сообщение:
attempt to index a nil value (local 'xPlayer'). Lua читает это так: на строке 42 вы попытались использовать что-то внутриxPlayer, ноxPlayerравенnil.
Откройте файл, перейдите на эту строку и посмотрите на переменные, которые эта строка использует. В большинстве случаев ответ уже там. Распространенные сообщения имеют свои собственные руководства: attempt to call a nil value и attempt to compare nil.
Stack trace: как код попал туда
Строки, начинающиеся с >, — это stack trace. Она перечисляет функции, которые были выполняются, от неудачной до той, которая её запустила:
> handler (@my_script/server/main.lua:42)
> ref (citizen:/scripting/lua/scheduler.lua:...)Первая строка после ошибки — это то же место, что и ошибка. Строки ниже показывают, кто вызвал эту функцию. Когда ошибка находится внутри библиотеки или другого ресурса, строка из вашего собственного скрипта дальше вниз по списку часто является настоящей причиной, потому что ваш скрипт передал неправильное значение в неё.
Строки, которые начинаются с citizen:/scripting/lua/... (например citizen:/scripting/lua/scheduler.lua) принадлежат FiveM самому. Они являются частью механизма, который запускает ваши события и потоки. Вы можете их игнорировать: ошибка никогда не исправляется там, и они только показывают, что поток или событие работало.
Клиент или сервер: где смотреть
Ошибка скрипта появляется на стороне, где код работает:
- Скрипты клиента (
client_scripts, файлы в папкеclient): нажмите F8 в игре, чтобы открыть консоль клиента. Если вы ничего не видите, прокрутите вверх, так как ошибки могут быстро исчезнуть. - Скрипты сервера (
server_scripts, файлы в папкеserver): прочитайте консоль сервера. В txAdmin это страница Live Console. На сервере, запущенном из терминала, это окно этого терминала. - Общие скрипты работают с обеих сторон, поэтому ошибка может появиться в любом месте.
Совет: если меню или действие ничего не делает и F8 пусто, проверьте консоль сервера. Неудачный код может быть на стороне сервера.
Какую строку посмотреть
- Прочитайте сообщение в первую очередь: оно говорит, какой вид проблемы это (
nil, неправильный тип, отсутствующий экспорт). - Откройте файл и строку из первой строки. Проверьте каждую переменную на ней.
- Если файл принадлежит библиотеке (ox_lib, фреймворку), перейдите вниз по stack trace до тех пор, пока не достигнете строки скрипта, который вы исправляете.
- Проверьте, если ошибка появляется один раз или постоянно. Постоянная ошибка в цикле затопляет консоль. Исправьте это сначала, так как она скрывает другие сообщения.
Ошибки с текстом No such export или could not find dependency отличаются. Они о ресурсах, а не о строках кода. Смотрите could not find dependency.
Когда строки недостаточно: добавьте prints
Если строка использует несколько переменных и вы не знаете, какая из них nil, выведите их непосредственно перед ней:
print('xPlayer:', xPlayer)
print('source:', source, type(source))
print('data:', json.encode(data))Запустите код снова и прочитайте консоль. Несколько советов для полезных prints:
- Выведите тип а также значение:
type(value)показываетnil,number,string,tableилиfunction. - Используйте
json.encode(table)чтобы увидеть внутри таблицы. Простойprint(table)только показывает адрес памяти. - Поместите короткую метку впереди, чтобы вы могли найти строку в занятой консоли.
- Выведите в начале функции, чтобы подтвердить, что она вообще выполняется.
Удалите prints после того, как проблема решена, так как они стоят производительность в занятых циклах.
Где ошибка не появляется
- Escrow скрипты скрывают их код. Ошибка дает вам имя файла, но файл зашифрован и вы не можете прочитать строку. Свяжитесь с автором с полным текстом ошибки.
- NUI ошибки (само меню, написанное на HTML и JavaScript) не показывают в F8 как
SCRIPT ERROR. Откройте инструменты разработки NUI чтобы их прочитать: командаnui_devtoolsв консоли F8 открывает их в вкладке браузера. - Ошибки в первые секунды: когда вы запускаете сервер, ошибки из ресурсов, которые не загружаются, могут пройти быстро. Поищите консоль или прокрутите вверх, или перезагрузите только один ресурс и смотрите.
Что отправить когда вы просите помощь
Скопируйте полную ошибку, stack trace включена, как текст, и скажите, исходит ли она из F8 или из консоли сервера. Добавьте строку кода, на которую она указывает, и фреймворк, который вы используете. Снимок экрана одной обрезанной строки недостаточно для кого-либо, чтобы помочь вам.
Контрольный список
| Симптом | Исправление |
|---|---|
@resource/path.lua:42 |
Откройте этот файл в этом ресурсе и перейдите на строку 42 |
| Ошибка в файле библиотеки | Следуйте stack trace к первой строке вашего собственного скрипта |
citizen:/scripting/lua/... строки |
FiveM внутренние: игнорируйте их |
| Ничего в F8, но функция не работает | Прочитайте консоль сервера |
| Несколько переменных на неудачной строке | Выведите каждую с type() и json.encode() |
| Файл ошибки нечитаемый | Escrowed скрипт: отправьте полный текст ошибки автору |
| NUI меню не работает | Откройте nui_devtools и прочитайте консоль браузера |
Короткие ответы
Где я вижу ошибку скрипта клиента?
Нажмите F8 в игре, чтобы открыть консоль клиента. Ошибки из скриптов клиента показывают там в красном, с именем ресурса и строкой.
Где я вижу ошибку серверного скрипта?
В консоли сервера, которая является Live Console в txAdmin или окном терминала, где работает сервер. Ошибки сервера не показываются в F8.
Ошибка указывает на файл в другом ресурсе. Этот скрипт сломан?
Не всегда. Посмотрите дальше вниз по stack trace: строка, которая вызывает в этот ресурс, с неправильными или отсутствующими аргументами, часто является настоящей причиной.
Скрипты без этой проблемы
Mic PhoneСкладной телефон, который раскладывается в планшет и работает и на настоящем телефоне игрока.Смотреть скрипт →
CCTV Security CamerasУстанавливаемые камеры, планшет с мультиэкраном в реальном времени и распечатанные фото-улики.Смотреть скрипт →
Advanced BoostingУгон машин на заказ через планшет: контракты от класса D до S+, команды и живая очередь.Смотреть скрипт →