调试Lua脚本时触发Assertion Failed错误的原因排查
LuaBridge断言失败:调用MyData::SomeMethod()触发assert(lua_isuserdata(L, 1))错误
可能的问题原因
成员函数绑定错误
大概率是你把SomeMethod当成全局函数绑定,而非MyData的成员函数。比如C++中SomeMethod是MyData的成员,但绑定代码写成了全局函数注册:lua::function(L, "SomeMethod", &MyData::SomeMethod); // 错误写法正确的绑定方式应该是在
MyData的类绑定块内注册:lua::class_<MyData>(L, "MyData") .function("GetNumPoints", &MyData::GetNumPoints) .function("SomeMethod", &MyData::SomeMethod); // 正确写法错误绑定下,Lua调用
obj:SomeMethod()会把obj作为第一个参数传给全局函数,但全局函数的绑定逻辑不会处理userdata,导致LuaBridge检查栈顶元素类型时触发断言。C++方法意外修改Lua栈
哪怕SomeMethod是空实现,如果里面误写了Lua栈操作代码(比如lua_pushnil(L)),会破坏栈平衡。调用完方法后,栈顶第一个元素不再是原来的MyDatauserdata,触发断言。Lua脚本调用语法异常
确认脚本里的调用语法是obj:SomeMethod()而非obj.SomeMethod()(后者不会把obj作为第一个参数传入)。另外检查是否传了多余参数,比如obj:SomeMethod(123),若绑定的方法是无参的,部分LuaBridge版本可能因栈结构异常触发断言。
调试建议(ZeroBrane)
- 在ZeroBrane给LuaBridge的
namespace.h第127行断言处设断点,触发后在调试控制台执行print(lua_typename(L, 1)),查看栈顶元素类型(若不是userdata,说明调用时第一个参数不符合预期)。 - 在Lua脚本调用
SomeMethod前加print(type(obj)),确认obj是userdata类型。 - 核对C++侧
SomeMethod的实现,确保没有任何Lua栈操作代码;同时检查绑定代码,确认方法是注册在MyData类的绑定块内。
内容的提问来源于stack exchange,提问作者Tiger Galo
相关产品推荐
相关产品推荐

