公司的手游项目,使用的是基于cocos2d-x绑lua的解决方案(参数quick-x的绑定),虽然使用了lua进行开发,更新很爽了,但是崩溃依然较为严重,从后台查看崩溃日志时,基本上只能靠“猜”来复现bug。更为郁闷的是很多时候并没有使用log输出,在崩溃日志里还无法查看大概在哪一步操作崩溃的…

 

后来在网上搜索了一下,受到一点启发,lua代码在执行的时候可随时调用debug.traceback()方法来获得调用栈的字符串信息,如下图所示:

 

而c++导出方法给lua调用,是使用tolua++工具实现的,通过ant实现将多个pkg文件生成一个cpp文件。所以只能在ant的build.xml配置中想办法了,好在ant本身就支持正则的任务“ReplaceRegExp”,在调用的方法前面添加打印堆栈的方法即可。

 

打印lua调用堆栈的方法:

// 打印lua调用栈开始  
lua_getglobal(tolua_S, "debug");
lua_getfield(tolua_S, -1, "traceback");
int iError = lua_pcall( tolua_S,//VMachine
0,//Argument Count
1,//Return Value Count
0);
const char* sz = lua_tostring(tolua_S, -1); CCLog(sz);

Ant脚本build.xml添加一项任务:

<replaceregexp file="LuaBJMEngine.cpp" 
match="^\s+self->([^;]+);$" replace='lua_getglobal(tolua_S, "debug"); lua_getfield(tolua_S, -1, "traceback"); int iError = lua_pcall(tolua_S, 0, 1, 0); const char* sz = lua_tostring(tolua_S, -1); CCLOG(sz); self->\1;'
byline="true"
flags="g"/>

注:&#xA为换行符

 

参数资源:

lua调用C++函数崩溃时,查看lua的调用栈信息 (特别适用于tolua++)

cocos2d-x集成lua

导出 C/C++ API 给 Lua 使用

build.xml示例

Ant-Tasks

Lua调用C++时打印堆栈信息的更多相关文章

  1. log显示error时的堆栈信息理解和分析

    error显示的log堆栈信息,是从最深层(最内层)的堆栈信息开始由内向外打印的. error显示的log堆栈信息,是从最深层(最内层)的堆栈信息开始由内向外打印的. error显示的log堆栈信息, ...

  2. log4j打印堆栈信息

    原文地址:https://blog.csdn.net/xianyu_0418/article/details/6043174 大家都知道,网站在运行的过程中,打印必要的log对记录网站的运行情况.从而 ...

  3. SpringBoot-技术专区-详细打印启动时异常堆栈信息

    SpringBoot在项目启动时如果遇到异常并不能友好的打印出具体的堆栈错误信息,我们只能查看到简单的错误消息,以致于并不能及时解决发生的问题,针对这个问题SpringBoot提供了故障分析仪的概念( ...

  4. C/C++打印堆栈信息

    转自:http://www.cnblogs.com/zhurizhe/p/3412369.html 在C/C++程序中打印当前函数调用栈 前几天帮同事跟踪的一个程序莫名退出,没有core dump(当 ...

  5. 转:Xcode打印堆栈信息

    2#   分享于 14-11-26 19:15:36 Chrome 39.0.2171.71 Mac OS X 10.10.1 如果只是看调用栈的话,可以使用 lldb 的功能.在你的代码里面打上一个 ...

  6. java Exception 出错的栈信息打印到日志中 打印堆栈信息

    我们在开发程序的过程当中,日志是必不可少的工具,这有助于我们分析问题的原因,和出错的详细信息,而java的异常机制又会方便且迅速的帮我们找到出错行的位置. try { .... } catch (Ex ...

  7. 如何让ubuntu启动时打印字符信息----字符启动

    一.概述 要想实现字符启动,需要修改grub.cfg(启动配置文件),将“静态启动”改为“字符启动”. 但是grub.cfg通常只作为只读文件,修改它时实际上修改的是其他的文件然后再通过update- ...

  8. python 打印堆栈信息方法

    第一种方法使用logging模块 import logging def test(self): try: 1 / 0 # 触发异常 except BaseException as e: logging ...

  9. java打印堆栈信息

    StackTraceElement[] stackElements = new Throwable().getStackTrace(); if(stackElements != null){ for( ...

随机推荐

  1. .NetCore 利用Jenkins在 Windows平台下打包发布Angular项目

    准备环境 安装Jenkins 首先装node,版本根据实际环境而定(node安装包中包含了npm) 安装一般都配置好了环境变量,检查下如果没有就配置下 Jenkins中安装NPM插件 GIt获取代码 ...

  2. Java 中的 protected 访问修饰符你真的了解吗?

    protected Java 中的 protected 访问修饰符 总结 在同一个包中,类中 protected 或 default 修饰的属性或方法可以在类外被其对象 (实例) 外部访问,也可以被子 ...

  3. P1020 导弹拦截 dp 树状数组维护最长升序列

    题目描述 某国为了防御敌国的导弹袭击,发展出一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到达任意的高度,但是以后每一发炮弹都不能高于前一发的高度.某天,雷达捕捉到敌国的导弹 ...

  4. 001.etcd简介及单节点使用

    一 etcd简介 1.1 概述 etcd 是 CoreOS 团队发起的开源项目,是一个管理配置信息和服务发现(service discovery)的项目,它的目标是构建一个高可用的分布式键值(key- ...

  5. NLP自然语言处理系列5-支持向量机(SVM)

    1.什么是支持向量机 支持向量机(Support Vector Machine,SVM)是一种经典的分类模型,在早期的文档分类等领域有一定的应用.了解SVM的推导过程是一个充满乐趣和挑战的过程,耐心的 ...

  6. java数组反射实现动态的判断一个对象是否是数组并且对数组进行拆包输出

    public static Map<String, String> maptoMapString(Map<String, ?> map) { return map.entryS ...

  7. codevs 1086 栈 2003年NOIP全国联赛普及组

    题目描述 Description 栈是计算机中经典的数据结构,简单的说,栈就是限制在一端进行插入删除操作的线性表. 栈有两种最重要的操作,即pop(从栈顶弹出一个元素)和push(将一个元素进栈). ...

  8. BZOJ.1021.[SHOI2008]循环的债务(DP)

    题目链接 不同面额的钞票是可以分开考虑的. ↑其实并不很明白具体(证明?),反正是可以像背包一样去做. f[x][i][j]表示用前x种面额钞票满足 A有i元 B有j元 (C有sum-i-j)所需交换 ...

  9. 13、Redis的发布订阅模式

     写在前面的话:读书破万卷,编码如有神 -------------------------------------------------------------------------------- ...

  10. Slickflow.NET 开源工作流引擎基础介绍(十) -- 邮件轮询异步发送模块集成

    前言:在任务数据生成时,为了让办理任务的用户及时获取到待办任务的主题和内容,需要发送通知类的消息,而电子邮件和手机端的短信通知则是比较普通的消息发送.本文是针对电子邮件异步发送模块的实现来做实例说明. ...