這是一個坑,天坑!如果不是我隨手刪除了一個本地變量,這個問題直到現在我應該也沒有頭緒。
首先,寫了一個新的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棧維護有問題,棧頂一直在往上升。因此必須仔細看代碼,觀察什么地方沒有及時清除堆棧