stack overflow
Bir script kendini defalarca çağırdı ve yer kalmayana kadar sürdü. Bir şey kendi içine döngü yapıyor.
Önce şunu yap
Adlandırdığı kaynağı not et ve durdur — yoksa gerisini de beraberinde götürmeyi sürdürür.
Ne anlama gelir
Bir fonksiyon, doğrudan ya da bir zincir üzerinden, Lua'nın çağrı yığını tükenene kadar kendini çağırdı. Script orada durur. Bir sunucuda bu, genelde başlangıçta komple kaynağı götürür, ki "başlar başlamaz stack overflow" olarak görünmesinin nedeni budur.
Neden olur
Ne sıklıkla doğru cevap olduğuna göre sıralı.
- 1
Taban durumu olmayan doğrudan özyineleme
Her zaman kendini çağıran bir fonksiyon. Bilerek nadirdir, iki fonksiyona aynı ad verildiğinde kazara yaygındır.
- 2
Kendini tetikleyen bir olay
İçinde
TriggerEvent('myres:update', ...)çağıran birmyres:updateişleyicisi. Her tetikleme eşzamanlıdır, o yüzden özyineler. - 3
Kendini gösteren bir metatable __index
setmetatable(t, { __index = t }). Eksik her anahtar sonsuza kadar özyineler. - 4
Birbirini tetikleyen iki kaynak
A, B'nin olayını tetikler; B'nin işleyicisi A'nınkini tetikler. Hiçbir dosya tek başına özyinelemeli görünmez.
- 5
Döngü içeren, serileştirilen derin bir tablo
Kendini içeren bir tabloda
json.encode.
Hangisinin seninki olduğu nasıl anlaşılır
Geri iz tekrar eder. Çerçevelerde aynı dosya ve satırın tekrar tekrar görünmesine bak — o çift döngüdür. İz kırpılmışsa, şüphelendiğin fonksiyonun başına bir print ekle ve durmadan tetiklenmesini izle.
Nereye bakmalı
Geri izde tekrar eden çerçeve.
Nasıl düzeltilir
Özyinelemeye bir taban ver, ya da olay döngüsünü kır:
-- kendine yeniden girmemesi gereken bir olay
local updating = false
AddEventHandler('myres:update', function(data)
if updating then return end
updating = true
-- iş
updating = false
end)Hâlâ kendi kodunda mı takıldın?
Bu sayfa, bu hatanın genelde ne anlama geldiğini anlatır. Konsolunu Server Fixer'a yapıştır; içindeki her şeyi sıraya dizer ve önce ne yapman gerektiğini söyler. Kendin uğraşmak istemiyorsan ORBIE script'i onarır ve kaynağı sunucuna atmaya hazır geri verir.
bug_reportServer Fixer'ı açBu tür bir hata için Script Optimizer script'i okur ve bunun arkasındaki kodu onarır.
Bununla birlikte gelen hatalar
- Thread takılması ya da kaynak fazla uzun sürüyor
- hitch warning (kare süresi sıçraması)
- cannot resume dead coroutine
- SCRIPT ERROR in citizen:/scripting/lua/scheduler.lua
- attempt to index a number, boolean or string value
- attempt to yield across a C-call boundary
- table index is nil
- attempt to index a nil value