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:
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
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.luato nazwa zasobu (my_script) i ścieżka pliku wewnątrz folderu zasobu.:42to 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ątrzxPlayer, alexPlayertonil.
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:
> 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 folderzeclient): 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 folderzeserver): 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ć
- Przeczytaj wiadomość najpierw: mówi, jaki rodzaj problemu to jest (
nil, zły typ, brakujący export). - Otwórz plik i linię z pierwszej linii. Sprawdzaj każdą zmienną na niej.
- Jeśli plik należy do biblioteki (ox_lib, frameworku), przejdź w dół stack trace, aż dojdziesz do linii skryptu, który naprawiasz.
- 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ą:
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)pokazujenil,number,string,tablelubfunction. - Użyj
json.encode(table)aby zobaczyć wnętrze tabeli. Zwykłyprint(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ć: polecenienui_devtoolsw 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 →