LuaJIT,损坏了Lua堆栈,并获得了全局表

时间:2014-02-11 06:59:07

标签: lua luajit

我目前正在努力将游戏(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的其他重要内容?

2 个答案:

答案 0 :(得分:3)

经过一些试验和错误之后,我发现我们的构建系统在LuaJIT之前从不同的Lua分发中提取Lua头。这导致了损坏的堆栈。

将旧的分发版的硬编码#include指令删除,并将LuaJIT的标题正确放入编译路径后,我能够再次成功操作全局堆栈。

答案 1 :(得分:0)

打开Lua的断言,看看会发生什么。通常情况下,你在Lua中逃避LuaJIT并不那么宽容的东西。为Lua转换断言将帮助您隔离问题(是您的代码 - 最有可能还是LuaJIT本身)