2

我目前正在将游戏(Bitfighter)从 Lua 5.1 迁移到 LuaJIT 2.0.2。我已经得到了适当的编译和链接;但是,当运行游戏并实际尝试运行 lua 脚本(用于机器人)时,我似乎得到了一个损坏的堆栈。

尝试为脚本设置环境时会出现问题 - 我在制作副本之前获取全局环境:

lua_pushvalue(L, LUA_GLOBALSINDEX);                      // -- globalEnv

但是,当在这里转储堆栈时,堆栈有 1 项是 a LUA_TSTRING,其值为NULL(堆栈事先为空)。这在链接到普通 Lua 5.1 库时没有问题,并且上述调用正确地将全局表推入堆栈。

我读到这可能意味着堆栈在其他地方已损坏,并且 LuaJIT 不如普通 VM 宽容。我打开了 LuaJIT-DLUA_USE_ASSERT-DLUA_USE_APICHECK编译器标志,但没有被触发。

在设置脚本环境之前,我们lua_pcall使用 C API 将几个脚本加载到全局环境中,并设置几个其他全局变量。这些会导致像这样的未知堆栈损坏吗?

如何找到堆栈损坏?或者,我是否遗漏了 LuaJIT 的其他重要内容?

4

2 回答 2

3

经过更多的反复试验,我发现我们的构建系统在 LuaJIT 之前从不同的 Lua 发行版中提取 Lua 标头。这导致了损坏的堆栈。

在删除旧发行版的硬编码#include指令,并将 LuaJIT 的头文件正确放置在编译路径上之后,我能够再次成功地操作全局堆栈。

于 2014-02-12T02:53:55.273 回答
0

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

于 2014-02-11T08:51:25.937 回答