THE ORB
Studio wird gestartet

Stack-Überlauf

Ein Script hat sich immer wieder selbst aufgerufen, bis der Platz ausging. Etwas läuft in sich selbst im Kreis.

groupsDieses Script stirbt komplettcodeBraucht einen Entwickler

Mach das zuerst

Notier, welche Resource genannt wird, und stopp sie — sie reißt sonst weiter den Rest mit.

bug_reportFüg lieber deine ganze Konsole ein

Was es bedeutet

Eine Funktion hat sich selbst aufgerufen, direkt oder über eine Kette, bis Lua der Aufrufstapel ausging. Das Script hält dort an. Auf einem Server reißt das oft die ganze Resource beim Start mit — daher „stack overflow direkt nach dem Start".

Was es auslöst

Sortiert danach, wie oft es die Antwort ist.

  1. 1

    Direkte Rekursion ohne Abbruchbedingung

    Eine Funktion, die sich immer selbst aufruft. Absichtlich selten, versehentlich häufig, wenn zwei Funktionen denselben Namen bekamen.

  2. 2

    Ein Event, das sich selbst auslöst

    Ein Handler für myres:update, der in sich selbst TriggerEvent('myres:update', ...) aufruft. Jedes Auslösen ist synchron, also rekursiert es.

  3. 3

    Ein __index einer Metatabelle, der auf sich selbst zeigt

    setmetatable(t, { __index = t }). Jeder fehlende Schlüssel rekursiert endlos.

  4. 4

    Zwei Resources, die einander auslösen

    A löst Bs Event aus, und Bs Handler löst As aus. Keine der beiden Dateien wirkt für sich rekursiv.

  5. 5

    Eine tiefe Tabelle mit einem Zyklus serialisiert

    json.encode auf einer Tabelle, die sich selbst enthält.

Wie du erkennst, welcher deiner ist

Die Spur wiederholt sich. Such dieselbe Datei und Zeile, die immer wieder in den Rahmen auftaucht — dieses Paar ist die Schleife. Ist die Spur abgeschnitten, setz ein print an den Kopf der verdächtigen Funktion und sieh zu, wie es endlos feuert.

Wo du nachsehen musst

Der sich wiederholende Rahmen in der Spur.

Wie du es behebst

Gib der Rekursion einen Boden oder brich den Event-Kreis:

-- ein Event, das sich nicht selbst wieder betreten darf
local updating = false
AddEventHandler('myres:update', function(data)
    if updating then return end
    updating = true
    -- Arbeit
    updating = false
end)

Hängst du immer noch an deinem eigenen Code?

Diese Seite sagt, was dieser Fehler üblicherweise bedeutet. Füg deine Konsole in Server Fixer ein: es sortiert alles darin und sagt dir, was zuerst dran ist; und wenn du lieber nicht ranwillst, kann ORBIE das Script reparieren und dir die Resource fertig zum Einsetzen zurückgeben.

bug_reportServer Fixer öffnen

Für diese Art Fehler Script Optimizer liest das Script und repariert den Code dahinter.

Fehler, die mit diesem zusammen auftreten