公司的手游项目,使用的是基于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"/>
注:
为换行符
参数资源:
lua调用C++函数崩溃时,查看lua的调用栈信息 (特别适用于tolua++)
来源:https://www.cnblogs.com/meteoric_cry/p/3665258.html