débordement de pile
Un script s'est appelé lui-même encore et encore jusqu'à manquer de place. Quelque chose boucle sur soi-même.
Faites d'abord ceci
Notez la ressource qu'il nomme et arrêtez-la : elle va continuer d'entraîner les autres.
Ce que ça veut dire
Une fonction s'est appelée elle-même, directement ou par une chaîne, jusqu'à épuiser la pile d'appels de Lua. Le script s'arrête là. Sur un serveur, cela emporte souvent toute la ressource au démarrage, d'où le « stack overflow juste après le démarrage ».
Ce qui la provoque
Classé par fréquence : la cause la plus probable en premier.
- 1
Récursion directe sans cas de base
Une fonction qui s'appelle toujours elle-même. Rare volontairement, courante par accident quand deux fonctions ont reçu le même nom.
- 2
Un événement qui se déclenche lui-même
Un gestionnaire de
myres:updatequi appelleTriggerEvent('myres:update', ...)en son sein. Chaque déclenchement est synchrone, donc il récurse. - 3
Un __index de métatable qui pointe sur lui-même
setmetatable(t, { __index = t }). Toute clé manquante récurse indéfiniment. - 4
Deux ressources qui se déclenchent mutuellement
A déclenche l'événement de B, et le gestionnaire de B déclenche celui de A. Aucun des deux fichiers ne paraît récursif isolément.
- 5
Une table profonde sérialisée avec un cycle
json.encodesur une table qui se contient elle-même.
Comment savoir laquelle est la vôtre
La trace se répète. Cherchez le même fichier et la même ligne revenant encore et encore dans les cadres : cette paire est la boucle. Si la trace est tronquée, mettez un print en tête de la fonction suspecte et regardez-la se déclencher sans fin.
Où regarder
Le cadre qui se répète dans la trace.
Comment la corriger
Donnez un plancher à la récursion, ou cassez le cycle d'événements :
-- un événement qui ne doit pas se réentrer
local updating = false
AddEventHandler('myres:update', function(data)
if updating then return end
updating = true
-- travail
updating = false
end)Toujours bloqué sur votre propre code ?
Cette page explique ce que cette erreur signifie en général. Collez votre console dans Server Fixer : il classera tout ce qui s'y trouve et vous dira quoi faire en premier ; et si vous préférez ne pas y toucher, ORBIE peut réparer le script et vous rendre la ressource prête à déposer.
bug_reportOuvrir le Server FixerPour ce type d'erreur, le Script Optimizer lit le script et répare le code derrière tout ça.
Les erreurs qui voyagent avec celle-ci
- Thread bloqué ou ressource trop lente
- avertissement de à-coup (pic de temps d'image)
- impossible de reprendre une coroutine morte
- SCRIPT ERROR dans citizen:/scripting/lua/scheduler.lua
- tentative d'indexer un nombre, un booléen ou du texte
- tentative de yield à travers une frontière d'appel C
- l'index de la table est nil
- tentative d'indexer une valeur nil