[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发生了莫名其妙的崩溃问题,不妨尝试一下将栈容量扩大这一招,也许就是解决方案!

时间: 2024-08-21 18:08:19

[lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题的相关文章

lua 根据函数名字符串来执行函数

function myfunction(msg) print("this is msg fun " .. msg); end local fun =_G["myfunction"]; if fun then fun("is ok"); end lua 根据函数名字符串来执行函数

在JAVA中使用LUA脚本记,javaj调用lua脚本的函数(转)

最近在做一些奇怪的东西,需要Java应用能够接受用户提交的脚本并执行,网络部分我选择了NanoHTTPD提供基本的HTTP服务器支持,并在Java能承载的许多脚本语言中选择了很久,比如Rhino,Jython和JRuby之类,但它们都太过庞大,并且很难实现沙盒保护服务器环境.最后我的目光投向了Lua,那个被称为粘合剂的语言.遇到的第一个难题是选择所使用的库,纯Java实现的Lua解释器有很多,什么LuaJ,LuaJava,kahlua,还有不知名的mochalua,jill等等(好多好多),其中

Lua学习笔记--C调用Lua

Lua是一种嵌入式语言,可以很好的嵌入其他应用程序.lua为我们提供了一组灵活的C API,使C代码能够很好的与Lua进行交互.包括读写Lua全局变量,调用Lua函数,运行Lua代码,注册C函数反过来供Lua调用.简单的说,C能调用Lua,反过来Lua也能调用C.真的是灰常强大灵活的脚本!!现在,先来学习一下怎么用C调用Lua. 其实最简单的我们已经做过了,通过一个dofile,运行一个lua脚本文件. 一.栈 Lua与C的交互是通过一个虚拟栈进行的,这个栈对于Lua来说是严格的LIFO(后进先

用VC编译lua源码,生成lua语言的解释器和编译器

用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编译源码,我们需要编译: 一个静态库 一个动态库 一个lua语言解释器 一个lua编译器 建立一个工静态库工程 打开VC-->文件-->(点击)新建--(弹出框中选择)工程-->(win32 static library) 创一个空的工程 工程名为luaLib 把lua中所有的源码添加,去掉其

深入lua栈交互—cpp调用lua数据

lua是通过lua_state这个栈来和c 交互的 1.....lua栈 index 下往上增长 如: 1 2 3 4 5 6 2.....lua栈 index 是循环的 如下 index 上到下 是 3 2 1 0 -1 -2 -3 ,栈对应的值为     1     2     3     x     1     2     3      3......lua函数多个返回值如果上面是function返回了3个返回值,那么return a ,b,c  中 a=3 b=2 c=1 第一个返回值先

Lua初学者(三)--Lua 嵌入宿主语言(C++/C)

继续上节内容,在C中使用Lua,这个网上资源也比较多了,不过我这里也提下哈,毕竟自己过一遍还是很有好处的. 环境:Lua5.1,vs2013中文版 ----------------------------------------------------一.C++中配置 lua---------------------------------------- 1.下载lua源码么:http://www.lua.org/download.html 就OK了 2.打开VS2013,新建工程: 新建-->

LUA学习之路--初识LUA

LUA在葡萄牙语中是“月亮”的意思.1993年由巴西的Ponifical Catholic University开发.该语言是由一个来自计算机图形技术组织的团队开发,并作为自由软件发行.LUA开发小组的目标是开发一种小巧.高效并且能够很好的和C语言一起工作的编程语言.在脚本语言领域,LUA是最快.最高效的脚本语言之一. LUA和传统的脚本语言不同,它是一种易整合语言(glue language).一般的脚本语言用于控制执行重复的任务,而易整合语言可以让使用者把其他语言的功能整合在一起.这样就让脚

(转载)我所理解Cocos2d-x 3.6(Lua):Cocos如何绑定Lua自定义类

我所理解Cocos2d-x 3.6(Lua):Cocos如何绑定Lua自定义类 热血枫叶2015-06-19 16:27:182289 次阅读 Cocos2d-x 2.x 与 Cocos2d-x 3.x 差异(tolua++) Cocos2d-x在2.x版本里就是用toLua++和.pkg文件这么把自己注册进Lua环境里的,然而从Cocos2d-x 3.x开始,用bindings-generator脚本代替了toLua++. bindings-generator脚本的工作机制是: 1.不用编写.

Android学习笔记(十四)——在执行时加入碎片(附源代码)

在执行时加入碎片 点击获取源代码 将UI切割为多个可配置的部分是碎片的优势之中的一个,但其真正强大之处在于可在执行时动态地把它们加入到活动中. 1.使用上一篇创建的Fragments项目,在main.xml文件里凝视掉两个<fragment>元素: 2.在FragmentActivity.java中加入以下的代码: FragmentManager fragmentManager = getSupportFragmentManager();//向活动加入碎片 FragmentTransactio