[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.接下来我们开始编 ...
随机推荐
- div内填内容
<div contenteditable="true">可以编辑里面的内容</div> 这样就可以使div想textarea一样 可以加入自动换行与over ...
- 【XLL 框架库函数】 TempBool/TempBool12
创建一个包含了 Boolean 类型的 TRUE 或 FALSE 的 XLOPER/XLOPER12 LPXLOPER TempBool(int b); LPXLOPER12 TempBool12(i ...
- 关于搭建webservice以及无法通过URL访问的简易解决办法
之前工作天天在用webservice,但是从没有自己独立的搭建一个全新的项目,今天好不容易自己搭了一个webservice,报错不少,记录下来免得以后又忘了. 一.搭建webservice需要做的几点 ...
- unity3d中串口的使用
工作中遇到了串口的问题,通过查资料&实验写出了下面代码: 关于串口的代码我在网上看了好多,一种是用事件来做,另外一种使用线程来做:(经过试验,unity无法用串口自带的事件进行数据读取): 看 ...
- win7 打印机共享
1.在工具->文件夹选项->查看,将"使用简单文件共享"前面的勾勾去掉2.在控制面板->用户帐号,将guest帐户启用3.运行"gpedit.msc&q ...
- 利用stack结构,将中缀表达式转换为后缀表达式并求值的算法实现
#!/usr/bin/env python # -*- coding: utf-8 -*- # learn <<Problem Solving with Algorithms and Da ...
- hadoop入门(2)——HDFS2.0应用场景、原理、基本架构及使用方法
一.HDFS概述 优点:高容错性.适合批处理.适合大数据处理.流式文件访问:一次写入,多次读取. 缺点:不适合低延迟数据访问.不适合小文件存取(受限于NameNode) ...
- Vue#表单控件绑定
使用v-model 在表单控件上实现数据双向绑定. 单选:https://jsfiddle.net/miloer/bs49p0fx/ <input type="checkbox&quo ...
- Java基础知识点2:hashCode()方法
hashCode()方法基本实现 hashCode方法是Java的Object类所定义的几个基本方法之一.我们可以深入到Object类的源码中去查看: public native int hashCo ...
- Daily Scrum Meeting ——SixthDay
一.Daily Scrum Meeting照片 佳恺请假了...可能去约会了罢 二.Burndown Chart 欣慰,但是还是感到"鸭梨山大"! 三.项目进展 1.活动列表查询功 ...