立即登录

lua脚本解密工具 【LuaAI引擎魔改】-01-Lua异常泄漏

11/28 06:10:56

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】 免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!

最新资讯