[lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题
这是一个坑,天坑!如果不是我随手删除了一个本地变量,这个问题直到现在我应该也没有头绪。
首先,写了一个新的lua脚本,载入,执行。在执行的时候,出了这么一个莫名其妙的问题:
EXC_BAD_ACCESS

莫名其妙是不是?如果是某个函数访问了nil,或之类的lua语法范围内的问题,pcall肯定会触发错误处理函数打出log。而如果是调用的c++函数出现了错误,那也应该崩溃在那个函数相关的地方。在这种地方崩溃,让人摸不着头脑。
没关系,本资深程序员,什么bug不是谈笑风生,来,log大法。通过log定位,问题出现在新lua类初始化时:
function DownHitStudy:__init(path, teacherNodes, playerNodes, guestures)
print("DownHitStudy:__init")
for _, elem in pairs(guestures) do
table.insert(self.recogs, LuaUtility:CreateGuesture(elem))
end
...
end
第一个print有,但循环体内部的log就没有了。
什么?如果guestures是nil,pcall不应该崩溃啊!如果它不是nil,这么一句正常的不能再正常的迭代式,怎么会崩溃?
好!没问题的!咱们看看guestures是什么东西!
for语句前添加一句table.dump()运行之。
咦,不太对,怎么这个table.dump没打印出来?这句也崩溃了?
难道table.dump()代码有问题?不可能啊,用了那么久了。
接下来,今天一天都在纠结中度过。毫无头绪,毫无头绪,饭也吃不香。这时,我无意中做了一件事情:我删掉了文件中一个外部local变量的定义。奇迹发生了,代码运行通过了!
回忆录到此结束,下面给出答案:
lua的栈不是自动扩展的,而是有一个最大可用大小。如果最大可用大小超过了,就会出现不可预知问题,比如发生上述不可描述的崩溃问题。解决的方法为,在初始化lua时添加一句:
lua_checkstack(L, );
这句话将最大栈容量设为1000。在我的情况下,解决了我的问题。如果您的lua发生了莫名其妙的崩溃问题,不妨尝试一下将栈容量扩大这一招,也许就是解决方案!
最后,这个方法是治标不治本的方法,只能让你的程序跑起来,但出现这个问题说明程序的lua栈维护有问题,栈顶一直在往上升。因此必须仔细看代码,观察什么地方没有及时清除堆栈
[lua大坑]一个莫名其妙的lua执行时崩溃引出的堆栈大小问题的更多相关文章
- windowsclient开发--使你的client执行时记住上次关闭的大小和位置
差点儿全部的windowsclient都能够调整大小,所以用户依据自己的喜好调整client的大小和位置. 可是当该client退出后,又一次执行client的时候.我们往往又要调整自己喜好的大小和位 ...
- 用 Lua 实现一个微型虚拟机-基本篇
用 Lua 实现一个微型虚拟机-基本篇 目录 介绍 机器指令模拟 最终核心代码 虚拟机内部状态可视化 完整项目代码 后续计划 参考 介绍 在网上看到一篇文章 使用 C 语言实现一个虚拟机, 这里是他的 ...
- luci框架-LUA的一个web框架使用
转自:http://blog.csdn.net/initphp/article/details/17527639 LUCI 这个在百度上搜索除了一篇我的百度文库 luci 的介绍文章之外,前三页都是些 ...
- Lua 是一个小巧的脚本语言
Redis进阶实践之七Redis和Lua初步整合使用 一.引言 Redis学了一段时间了,基本的东西都没问题了.从今天开始讲写一些redis和lua脚本的相关的东西,lua这个脚本是一个好东西,可以运 ...
- tolua#是Unity静态绑定lua的一个解决方案
tolua#代码简要分析 2017-04-16 23:02 by 风恋残雪, 98 阅读, 1 评论, 收藏, 编辑 简介 tolua#是Unity静态绑定lua的一个解决方案,它通过C#提供的反射信 ...
- 我为什么要再给lua写一个json模块
最近要给自己编写的服务器加上json解析模块.根据我当前的项目,可以预测服务器中使用json的地方: 通信.由于与客户端通信使用google protocolbuffer,仅在与SDK通信中使用jso ...
- [原][译][lua][luabridge]一个简单的luabridge与c++例子结合例子
参考:https://eliasdaler.wordpress.com/tag/luabridge/ https://eliasdaler.wordpress.com/2015/08/10/using ...
- 使用Golang + lua实现一个值班机器人
我们在的项目组呢,有一项工作是,收邮件(很大程度上使用邮件是为了存个底),然后从我们的系统里边查一下相关信息,然后回复个邮件的工作.虽然工作量并不大,但是会把时间切的稀碎.为了拯救我的时间,所以做了一 ...
- 用VC编译lua源码,生成lua语言的解释器和编译器
用VC编译lua源码,生成lua语言的解释器和编译器 1.去网址下载源码 http://www.lua.org/download.html 2.装一个VC++,我用的是VC6.0 3.接下来我们开始编 ...
随机推荐
- 用DateTime的ParseExact方法解析特殊的日期时间
今天遇到一个特别的需求,需要从下面的字符串中转换成一个DateTime对象: [07-13 15:50:42] 主要问题是这个时间不是标准的时间,而是自定义的格式,即开头是月-日,然后是时间. 使用最 ...
- MVC4.0
--后台ajax传值 <script type="text/javascript"> $(document).ready(function dianZan(id ...
- python中如何避免中文是乱码
这个问题是一个具有很强操作性的问题.我这里有一个经验总结,分享一下,供参考:首先,提倡使用utf-8编码方案,因为它跨平台不错.经验一:在开头声明: # -*- coding: utf-8 -*- 有 ...
- Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds -----》myeclipse2015
错误:Server Tomcat v7.0 Server at localhost was unable to start within 45 seconds 错误提示就是我们限定了部署的时间导致的错 ...
- MapKit/CoreLocation框架 总结
MapKit/CoreLocation框架 /*英译 core:核心 track:踪迹 current:当前 statellite:卫星 hybird:混合 region:范围 annotation ...
- WCF全面解析学习(1)
SOA的基本概念和设计思想 SOA并不是仅仅采用Web服务的架构,Web服务只是一种实现SOA的理想技术手段.SOA依赖于开放的标准.SOA的一个目标是让不同的厂商开发的服务能够相互操作. SOA支持 ...
- DB2 license过期的问题
今天启动DB2,无论如何都启动不了,报一个错误:“Windows 不能在 本地计算机 启动 DB2 - DB2COPY - DB2-0.有关更多信息,查阅系统事件日志.如果这是非 Microsoft ...
- Javascript数据类型检测
Javascript有5种简单数据类型和一种复杂数据类型 基本数据类型:String,Boolean,Number,Undefined, Null 引用数据类型:Object(Array,Date,R ...
- ibatis.net 中SqlMaps的xml文件的例子
<?xml version="1.0" encoding="utf-8" ?> <!--=========================== ...
- Xib中UIScrollView添加约束步骤
要往scrollView里面添加子控件--从向往下排 0.设置scrollView的上下左右约束距离控制器view边距为零(确定frame的大小) 1.要往scrollView添加一个内容View 2 ...