首页 > 代码库 > [lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题

[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) do4         table.insert(self.recogs, LuaUtility:CreateGuesture(elem))5     end6     ...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大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题