lua脚本解密工具 【LuaAI引擎魔改】-01-Lua异常泄漏
【LuaAI引擎魔改】-01-Lua异常泄漏问题
写lua脚本时手误拼写错误
运行时弹窗,给出的错误信息完全没用辅助论坛,我们只知道有一个错误
日志里也啥都没有
分析
选择重试,进入VS调试器
跟踪到异常,原来lua脚本层出错直接assert(false),丢失了lua的错误信息
修改
修改,lua层抛出异常时,从栈顶拿到错误信息,打日志并弹窗
结果
日志
弹窗
ok,现在我们出错时可以直接定位到是这一行代码的CreateSkybox符号有问题了
进一步
我们这样改了是否就真的完备了呢?其实并不
这里的逻辑是,引擎启动时调用了lua的Sandbox_Initialize 做脚本层初始化
这里我们的笔误是一个lua层的错误,使用了一个nil变量,lua能捕获这个异常
然而,如果lua又调用了C++函数,而C++函数抛出了异常,lua层无法感知到这个异常,直接跳过,最终由C++处理了这个异常,我们丢失了lua层的堆栈信息
问题
比如我们在修复了笔误后lua脚本解密工具,在C++层的CreateSkyBox里抛出一个异常
首先,我们遇到一个没有用的弹窗
堆栈
我们漏掉了lua脚本层的堆栈,只知道脚本层入口和C++抛出异常的位置
修改
在lua binding捕获异常
结果
我们在lua层抛出异常,可以定位到lua脚本中出错的位置
如果配合lua debugger(这里使用decoda)
decoda弹窗
选择break,可以看到lua层堆栈
总结
Sandbox Framework选择手写lua binding,在使用lua C API时还是有些粗糙的
C++和lua交互时,应该总是在交互边界上捕获异常(C++使用try-catchlua脚本解密工具,lua使用pcall),否则就会泄漏异常并丢失该部分的堆栈
在调用层次简单的情况下,问题还好跟踪,然而在庞大的代码项目中,这就会是一个隐患
参考
来源:【九爱网址导航www.fuzhukm.com】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!