desbordamiento de pila
Un script se llamó a sí mismo una y otra vez hasta quedarse sin sitio. Algo está entrando en bucle sobre sí mismo.
Haz esto primero
Anota qué recurso nombra y páralo: va a seguir llevándose por delante a los demás.
Qué significa
Una función se llamó a sí misma, directamente o a través de una cadena, hasta que Lua se quedó sin pila de llamadas. El script se detiene ahí. En un servidor esto suele llevarse el recurso entero al arrancar, y por eso aparece como «stack overflow justo después de arrancar».
Qué lo provoca
Ordenado por la frecuencia con la que es la respuesta.
- 1
Recursión directa sin caso base
Una función que siempre se llama a sí misma. Rara a propósito, común por accidente cuando a dos funciones les pusieron el mismo nombre.
- 2
Un evento que se dispara a sí mismo
Un manejador de
myres:updateque llama aTriggerEvent('myres:update', ...)dentro de sí mismo. Cada disparo es síncrono, así que recurre. - 3
Un __index de metatabla que apunta a sí mismo
setmetatable(t, { __index = t }). Cualquier clave que falte recurre para siempre. - 4
Dos recursos disparándose el uno al otro
A dispara el evento de B, y el manejador de B dispara el de A. Ninguno de los dos archivos parece recursivo por su cuenta.
- 5
Una tabla profunda serializada con un ciclo
json.encodesobre una tabla que se contiene a sí misma.
Cómo saber cuál es el tuyo
La traza se repite. Buscá el mismo archivo y la misma línea apareciendo una y otra vez en los marcos: ese par es el bucle. Si la traza está cortada, poné un print en la cabecera de la función sospechosa y mirala dispararse sin fin.
Dónde mirar
El marco que se repite en la traza.
Cómo arreglarlo
Dale un suelo a la recursión, o cortá el ciclo de eventos:
-- un evento que no tiene que volver a entrar en sí mismo
local updating = false
AddEventHandler('myres:update', function(data)
if updating then return end
updating = true
-- trabajo
updating = false
end)¿Sigues atascado en tu propio código?
Esta página es lo que suele significar este error. Pega tu consola en Server Fixer y ordenará todo lo que haya en ella y te dirá qué hacer primero; y si prefieres no tocarlo, ORBIE puede reparar el script y devolverte el recurso listo para soltar.
bug_reportAbrir el Server FixerPara este tipo de error, el Script Optimizer lee el script y repara el código que hay detrás.
Errores que viajan con este
- Hilo bloqueado o recurso tardando demasiado
- aviso de tirón (pico de tiempo de fotograma)
- no se puede reanudar una corrutina muerta
- SCRIPT ERROR en citizen:/scripting/lua/scheduler.lua
- intento de indexar un número, booleano o texto
- intento de ceder a través de un límite de llamada en C
- el índice de la tabla es nil
- intento de indexar un valor nil