[lua大坑]一個莫名其妙的lua執行時崩潰引出的堆棧大小問題


    這是一個坑,天坑!如果不是我隨手刪除了一個本地變量,這個問題直到現在我應該也沒有頭緒。

    首先,寫了一個新的lua腳本,載入,執行。在執行的時候,出了這么一個莫名其妙的問題:

    EXC_BAD_ACCESS

    莫名其妙是不是?如果是某個函數訪問了nil,或之類的lua語法范圍內的問題,pcall肯定會觸發錯誤處理函數打出log。而如果是調用的c++函數出現了錯誤,那也應該崩潰在那個函數相關的地方。在這種地方崩潰,讓人摸不着頭腦。

    

    沒關系,本資深程序員,什么bug不是談笑風生,來,log大法。通過log定位,問題出現在新lua類初始化時:

    

1 function DownHitStudy:__init(path, teacherNodes, playerNodes, guestures)
2     print("DownHitStudy:__init")
3     for _, elem in pairs(guestures) do
4         table.insert(self.recogs, LuaUtility:CreateGuesture(elem))
5     end
6     ...
7 end    

    第一個print有,但循環體內部的log就沒有了。

    什么?如果guestures是nil,pcall不應該崩潰啊!如果它不是nil,這么一句正常的不能再正常的迭代式,怎么會崩潰?

    好!沒問題的!咱們看看guestures是什么東西!

    for語句前添加一句table.dump()運行之。

    咦,不太對,怎么這個table.dump沒打印出來?這句也崩潰了?

    難道table.dump()代碼有問題?不可能啊,用了那么久了。

    接下來,今天一天都在糾結中度過。毫無頭緒,毫無頭緒,飯也吃不香。這時,我無意中做了一件事情:我刪掉了文件中一個外部local變量的定義。奇跡發生了,代碼運行通過了!

    

    回憶錄到此結束,下面給出答案:

    lua的棧不是自動擴展的,而是有一個最大可用大小。如果最大可用大小超過了,就會出現不可預知問題,比如發生上述不可描述的崩潰問題。解決的方法為,在初始化lua時添加一句:

lua_checkstack(L, 1000);

    這句話將最大棧容量設為1000。在我的情況下,解決了我的問題。如果您的lua發生了莫名其妙的崩潰問題,不妨嘗試一下將棧容量擴大這一招,也許就是解決方案!

     最后,這個方法是治標不治本的方法,只能讓你的程序跑起來,但出現這個問題說明程序的lua棧維護有問題,棧頂一直在往上升。因此必須仔細看代碼,觀察什么地方沒有及時清除堆棧


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM