Lua调用C++时打印堆栈信息

公司的手游项目,使用的是基于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");&#xA;lua_getfield(tolua_S, -1, "traceback");&#xA;int iError = lua_pcall(tolua_S, 0, 1, 0);&#xA;const char* sz = lua_tostring(tolua_S, -1);&#xA;CCLOG(sz);&#xA;self->\1;'
byline="true"
flags="g"/>

注:&#xA为换行符

 

参数资源:

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

cocos2d-x集成lua

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

build.xml示例

Ant-Tasks

posted @ 2014-04-14 23:53  meteoric_cry  阅读(7789)  评论(1编辑  收藏  举报