THE ORB
Démarrage du studio

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.

groupsCe script meurt complètementcodeIl faut un développeur

Faites d'abord ceci

Notez la ressource qu'il nomme et arrêtez-la : elle va continuer d'entraîner les autres.

bug_reportCollez plutôt toute votre console

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

    Un événement qui se déclenche lui-même

    Un gestionnaire de myres:update qui appelle TriggerEvent('myres:update', ...) en son sein. Chaque déclenchement est synchrone, donc il récurse.

  3. 3

    Un __index de métatable qui pointe sur lui-même

    setmetatable(t, { __index = t }). Toute clé manquante récurse indéfiniment.

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

    Une table profonde sérialisée avec un cycle

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

Pour 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