THE ORB
Uruchamiam studio

stack overflow

Skrypt wywoływał sam siebie w kółko, aż skończyło mu się miejsce. Coś zapętla się w siebie.

groupsTen skrypt umiera całkowiciecodePotrzebny programista

Zrób najpierw to

Zanotuj, który zasób wymienia, i zatrzymaj go — inaczej będzie ciągnął resztę za sobą.

bug_reportWklej zamiast tego całą konsolę

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. 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. 2

    Zdarzenie, które wywołuje samo siebie

    Handler myres:update, który w środku woła TriggerEvent('myres:update', ...). Każde wywołanie jest synchroniczne, więc rekuruje.

  3. 3

    Metatablica __index wskazująca sama na siebie

    setmetatable(t, { __index = t }). Każdy brakujący klucz rekuruje bez końca.

  4. 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. 5

    Głęboka tablica serializowana z cyklem

    json.encode na 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 Fixer

Dla tego rodzaju błędu Script Optimizer czyta skrypt i naprawia kod stojący za tym.

Błędy, które chodzą z tym w parze