Jak czytać FiveM SCRIPT ERROR: plik, linia i stack trace

Nauczysz się czytać FiveM SCRIPT ERROR: nazwę zasobu i ścieżkę pliku, numer linii, stack trace, F8 versus konsola serwera i jak dodawać wydruki, aby znaleźć przyczynę.

Typowy błąd w konsoli:

text
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:...)

Wygląda jak szum, ale każda część ma znaczenie i zwykle mówi ci dokładnie gdzie szukać. Ten przewodnik pokazuje, jak go czytać, gdzie go znaleźć i co zrobić, gdy to nie wystarczy.

Pierwsza linia: co, gdzie i dlaczego

text
SCRIPT ERROR: @my_script/server/main.lua:42: attempt to index a nil value (local 'xPlayer')
  • SCRIPT ERROR: oznacza błąd Lua w skrypcie. Skrypt ciągle działa po nim, ale kod, który się nie powiódł, zatrzymał się na tej linii.
  • @my_script/server/main.lua to nazwa zasobu (my_script) i ścieżka pliku wewnątrz folderu zasobu.
  • :42 to numer linii w tym pliku.
  • Reszta to wiadomość: attempt to index a nil value (local 'xPlayer'). Lua czyta to tak: na linii 42 spróbowałeś użyć czegoś wewnątrz xPlayer, ale xPlayer to nil.

Otwórz plik, przejdź do tej linii i spójrz na zmienne, które ta linia używa. W większości przypadków odpowiedź jest już tam. Popularne wiadomości mają własne przewodniki: attempt to call a nil value i attempt to compare nil.

Stack trace: jak kod się tam dostał

Linie zaczynające się od > to stack trace. Wyświetla funkcje, które były uruchomione, od działającej aż do tej, która ją uruchomiła:

text
> handler (@my_script/server/main.lua:42)
> ref (citizen:/scripting/lua/scheduler.lua:...)

Pierwsza linia po błędzie jest tym samym miejscem co błąd. Linie poniżej pokazują, kto wezwał tę funkcję. Gdy błąd jest wewnątrz biblioteki lub innego zasobu, linia z twojego własnego skryptu dalej na dole listy jest często rzeczywistą przyczyną, ponieważ twój skrypt przekazał do niego złą wartość.

Linie zaczynające się od citizen:/scripting/lua/... (na przykład citizen:/scripting/lua/scheduler.lua) należą do samego FiveM. Są częścią maszyny, która uruchamia twoje zdarzenia i wątki. Możesz je zignorować: błąd nigdy nie zostaje tam naprawiony i pokazują tylko, że wątek lub zdarzenie było uruchomione.

Klient lub serwer: gdzie szukać

Błąd skryptu pojawia się po stronie, gdzie kod działa:

  • Skrypty klienta (client_scripts, pliki w folderze client): naciśnij F8 w grze, aby otworzyć konsolę klienta. Jeśli nie widzisz nic, przewiń w górę, ponieważ błędy mogą szybko się przewinąć.
  • Skrypty serwera (server_scripts, pliki w folderze server): przeczytaj konsolę serwera. W txAdmin to strona Live Console. Na serwerze uruchomionym z terminala to to okno terminala.
  • Skrypty współdzielone uruchamiają się po obu stronach, więc błąd może pojawić się w każdym miejscu.

Wskazówka: jeśli menu lub akcja nic nie robią i F8 jest puste, sprawdź konsolę serwera. Kod, który się nie powiedzie, może być po stronie serwera.

Którą linię czytać

  1. Przeczytaj wiadomość najpierw: mówi, jaki rodzaj problemu to jest (nil, zły typ, brakujący export).
  2. Otwórz plik i linię z pierwszej linii. Sprawdzaj każdą zmienną na niej.
  3. Jeśli plik należy do biblioteki (ox_lib, frameworku), przejdź w dół stack trace, aż dojdziesz do linii skryptu, który naprawiasz.
  4. Sprawdzaj, czy błąd pojawia się raz czy stale. Stały błąd w pętli zalewa konsolę. Napraw ten pierwszy, ponieważ ukrywa inne wiadomości.

Błędy z tekstem No such export lub could not find dependency są inne. Chodzą o zasoby, nie o linie kodu. Zobacz could not find dependency.

Gdy linia nie wystarczy: dodaj wydruki

Jeśli linia używa kilka zmiennych i nie wiesz, która z nich to nil, wydrukuj je tuż przed nią:

lua
print('xPlayer:', xPlayer)
print('source:', source, type(source))
print('data:', json.encode(data))

Uruchom kod ponownie i przeczytaj konsolę. Kilka wskazówek dla użytecznych wydruków:

  • Wydrukuj typ oraz wartość: type(value) pokazuje nil, number, string, table lub function.
  • Użyj json.encode(table) aby zobaczyć wnętrze tabeli. Zwykły print(table) pokazuje tylko adres pamięci.
  • Umieść krótką etykietę z przodu, aby móc znaleźć linię w zajętej konsoli.
  • Wydrukuj na początku funkcji, aby potwierdzić, że w ogóle się uruchamia.

Usuń wydruki po naprawieniu problemu, ponieważ kosztują wydajność w zajętych pętlach.

Gdzie błąd się nie pojawia

  • Skrypty escrowed ukrywają ich kod. Błąd daje ci nazwę pliku, ale plik jest zaszyfrowany i nie możesz przeczytać linii. Skontaktuj się z autorem z pełnym tekstem błędu.
  • Błędy NUI (samo menu, napisane w HTML i JavaScript) nie pokazują się w F8 jako SCRIPT ERROR. Otwórz narzędzia developerskie NUI, aby je przeczytać: polecenie nui_devtools w konsoli F8 otwiera je w karcie przeglądarki.
  • Błędy w pierwszych sekundach: gdy uruchamiasz serwer, błędy z zasobów, które nie załadują się, mogą szybko przejść. Przeszukaj konsolę lub przewiń w górę, lub uruchom ponownie tylko jeden zasób i obserwuj.

Co wysłać, gdy prosisz o pomoc

Skopiuj pełny błąd, stack trace wliczony, jako tekst i powiedz, czy pochodzi z F8, czy z konsoli serwera. Dodaj linię kodu, na którą wskazuje i framework, którego używasz. Zrzut ekranu jednej przyciętej linii nie wystarczy, aby ktokolwiek ci pomógł.

Lista kontrolna

Symptom Naprawa
@resource/path.lua:42 Otwórz ten plik w tym zasobie i przejdź do linii 42
Błąd w pliku biblioteki Postępuj zgodnie ze stack trace do pierwszej linii twojego własnego skryptu
citizen:/scripting/lua/... linie Wewnętrzności FiveM: ignoruj je
Nic w F8, ale funkcja się nie powiedzie Przeczytaj konsolę serwera
Kilka zmiennych na niepowodzącą linię Wydrukuj każdą za pomocą type() i json.encode()
Plik błędu jest nieczytelny Escrowed script: wyślij pełny tekst błędu autorowi
Menu NUI zawala się Otwórz nui_devtools i przeczytaj konsolę przeglądarki

Szybkie odpowiedzi

Gdzie widzę błąd skryptu klienta?

Naciśnij F8 w grze, aby otworzyć konsolę klienta. Błędy ze skryptów klienta pojawiają się tam na czerwono, z nazwą zasobu i linią.

Gdzie widzę błąd skryptu serwera?

W konsoli serwera, która jest stroną Live Console w txAdmin lub oknem terminala, w którym serwer działa. Błędy serwera nie pokazują się w F8.

Błąd wskazuje na plik w innym zasobie. Czy ten skrypt jest zepsuty?

Nie zawsze. Spójrz dalej w stack trace: linia, która wezwała do tego zasobu, z złymi lub brakującymi argumentami, jest często rzeczywistą przyczyną.

Skrypty bez tego problemu

Mic PhoneSkładany telefon, który rozkłada się w tablet i działa też na prawdziwym telefonie gracza.Zobacz skrypt →CCTV Security CamerasKamery do rozstawienia, tablet z podglądem wielu kamer na żywo i drukowane zdjęcia jako dowody.Zobacz skrypt →Advanced BoostingBoosting pojazdów z tabletu: kontrakty od klasy D do S+, ekipy i kolejka na żywo.Zobacz skrypt →

Czytaj dalej