[lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题
Posted 长空小鹰
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[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栈维护有问题,栈顶一直在往上升。因此必须仔细看代码,观察什么地方没有及时清除堆栈
以上是关于[lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题的主要内容,如果未能解决你的问题,请参考以下文章