Stack-Überlauf
Ein Script hat sich immer wieder selbst aufgerufen, bis der Platz ausging. Etwas läuft in sich selbst im Kreis.
Mach das zuerst
Notier, welche Resource genannt wird, und stopp sie — sie reißt sonst weiter den Rest mit.
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
Direkte Rekursion ohne Abbruchbedingung
Eine Funktion, die sich immer selbst aufruft. Absichtlich selten, versehentlich häufig, wenn zwei Funktionen denselben Namen bekamen.
- 2
Ein Event, das sich selbst auslöst
Ein Handler für
myres:update, der in sich selbstTriggerEvent('myres:update', ...)aufruft. Jedes Auslösen ist synchron, also rekursiert es. - 3
Ein __index einer Metatabelle, der auf sich selbst zeigt
setmetatable(t, { __index = t }). Jeder fehlende Schlüssel rekursiert endlos. - 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
Eine tiefe Tabelle mit einem Zyklus serialisiert
json.encodeauf 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 öffnenFür diese Art Fehler Script Optimizer liest das Script und repariert den Code dahinter.
Fehler, die mit diesem zusammen auftreten
- Thread-Stall oder Resource braucht zu lange
- Hitch-Warnung (Frame-Zeit-Spitze)
- Tote Coroutine kann nicht fortgesetzt werden
- SCRIPT ERROR in citizen:/scripting/lua/scheduler.lua
- Versuch, eine Zahl, einen Boolean oder Text zu indizieren
- Versuch, über eine C-Aufrufgrenze zu yielden
- Tabellenindex ist nil
- Versuch, einen nil-Wert zu indizieren