我目前正在努力将游戏(Bitfighter)从Lua 5.1迁移到LuaJIT 2.0.2。我已经得到了适当的编译和链接;但是,当运行游戏并实际尝试运行lua脚本(对于机器人)时,我似乎得到了一个损坏的堆栈。
尝试为脚本设置环境时出现问题 - 我在复制之前抓住了全局环境:
lua_pushvalue(L, LUA_GLOBALSINDEX); // -- globalEnv
但是,在此处转储堆栈时,堆栈中有1个项LUA_TSTRING
,其值为NULL
(堆栈预先为空)。当链接到普通的Lua 5.1库并且上面的调用正确地将全局表推入堆栈时,这没有问题。
我读到这可能意味着堆栈在其他地方被破坏,并且LuaJIT比普通VM更不宽容。我打开了LuaJIT的-DLUA_USE_ASSERT
和-DLUA_USE_APICHECK
编译器标志,但没有触发任何内容。
在设置脚本环境之前,我们使用lua_pcall
将多个脚本加载到全局环境中,并使用C API设置其他几个全局变量。这会导致像这样的未知堆栈损坏吗?
如何找到堆栈损坏?或者,我是否遗漏了LuaJIT的其他重要内容?
答案 0 :(得分:3)
经过一些试验和错误之后,我发现我们的构建系统在LuaJIT之前从不同的Lua分发中提取Lua头。这导致了损坏的堆栈。
将旧的分发版的硬编码#include
指令删除,并将LuaJIT的标题正确放入编译路径后,我能够再次成功操作全局堆栈。
答案 1 :(得分:0)
打开Lua的断言,看看会发生什么。通常情况下,你在Lua中逃避LuaJIT并不那么宽容的东西。为Lua转换断言将帮助您隔离问题(是您的代码 - 最有可能还是LuaJIT本身)