从Lua触发的C++函数内调用脚本函数时Lua崩溃问题排查
问题根因
崩溃并不是发生在C调用bbb函数的阶段,而是发生在bbb函数内部执行for循环的阶段,属于Lua代码的语法使用错误:
Lua的泛型for ... in结构要求in关键字后跟迭代器三元组(迭代器函数、状态常量、控制变量初始值),你直接传入可变参数...会被展开为调用bbb时传入的3个参数100、200、deep dark fantasy,泛型for会把第一个值100当成迭代器函数尝试调用,数值类型本身没有__call元方法实现,所以触发了崩溃,和C侧的调用逻辑、类型校验完全无关。
修复方案
修改Lua侧bbb函数的可变参数遍历逻辑,通用写法如下:
-- 普通场景:参数无nil时可用 function bbb(...) for _, val in ipairs({...}) do print(val) end end
如果需要兼容参数中带nil的场景,可以用select逐位读取参数:
-- 兼容含nil参数的场景 function bbb(...) for i = 1, select('#', ...) do local val = select(i, ...) print(val) end end
附加排查点
如果确认崩溃确实发生在C调用lua_call触发bbb执行前的阶段,可以检查C项目链接的Lua头文件版本与实际运行的Lua动态库版本是否一致:不同Lua版本中LUA_TFUNCTION等类型枚举的数值定义可能存在差异,会导致你提前做的类型校验失效,实际压入栈的bbb并不是函数类型。
内容的提问来源于stack exchange,提问作者jiandingzhe
相关产品推荐
相关产品推荐

