[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执行时崩溃引出的堆栈大小问题的主要内容,如果未能解决你的问题,请参考以下文章

当元表 __index 指向函数并且未使用返回值时 Lua 崩溃

Lua中table长度到底是怎么来的

Lua 中断之后怎么从中断的位置继续执行

C#跟Lua如何超高性能传递数据

lua调用失败是啥意思

Lua C API 嵌套表段。过错