stack overflow
Skrypt wywoływał sam siebie w kółko, aż skończyło mu się miejsce. Coś zapętla się w siebie.
Zrób najpierw to
Zanotuj, który zasób wymienia, i zatrzymaj go — inaczej będzie ciągnął resztę za sobą.
Co to znaczy
Funkcja wywołała samą siebie, bezpośrednio albo przez łańcuch, aż Lua wyczerpała stos wywołań. Skrypt zatrzymuje się w tym miejscu. Na serwerze często kładzie to cały zasób przy starcie, i dlatego pokazuje się jako "stack overflow zaraz po uruchomieniu".
Co to powoduje
Uszeregowane według tego, jak często są odpowiedzią.
- 1
Bezpośrednia rekurencja bez przypadku bazowego
Funkcja, która zawsze woła samą siebie. Rzadka celowo, częsta przez przypadek, kiedy dwie funkcje dostały tę samą nazwę.
- 2
Zdarzenie, które wywołuje samo siebie
Handler
myres:update, który w środku wołaTriggerEvent('myres:update', ...). Każde wywołanie jest synchroniczne, więc rekuruje. - 3
Metatablica __index wskazująca sama na siebie
setmetatable(t, { __index = t }). Każdy brakujący klucz rekuruje bez końca. - 4
Dwa zasoby wywołujące się nawzajem
A wywołuje zdarzenie B, handler B wywołuje zdarzenie A. Z osobna żaden plik nie wygląda rekurencyjnie.
- 5
Głęboka tablica serializowana z cyklem
json.encodena tablicy, która zawiera samą siebie.
Jak poznać, który jest twój
Traceback się powtarza. Poszukaj tego samego pliku i linii pojawiających się w ramkach w kółko — ta para to pętla. Jeśli ślad jest ucięty, dodaj printa na początku podejrzanej funkcji i patrz, jak odpala się bez końca.
Gdzie szukać
Powtarzająca się ramka w tracebacku.
Jak to naprawić
Daj rekurencji dno albo przerwij cykl zdarzeń:
-- zdarzenie, które nie może wejść samo w siebie
local updating = false
AddEventHandler('myres:update', function(data)
if updating then return end
updating = true
-- praca
updating = false
end)Wciąż utknąłeś na własnym kodzie?
Ta strona mówi, co ten błąd zwykle oznacza. Wklej swoją konsolę do Server Fixera, a uszereguje wszystko, co w niej jest, i powie, co zrobić najpierw; a jeśli wolisz tego nie ruszać, ORBIE naprawi skrypt i odda ci zasób gotowy do wrzucenia.
bug_reportOtwórz Server FixerDla tego rodzaju błędu Script Optimizer czyta skrypt i naprawia kod stojący za tym.