如何调试嵌入在我的 C++ 应用程序中的 Lua 5.2.2 代码?
我已经看过这个问题,其中提供的所有 IDE 都处理 5.1 及更低版本,当我尝试将它们与 5.2.2 一起使用时,它们会崩溃。
您应该能够按照 Lua 5.2 调试说明使用 ZeroBrane Studio 调试您的应用程序。请注意,您需要针对 Lua5.2 编译 luasocket。(您看到的崩溃可能是因为您的应用程序加载了针对 Lua5.1 编译的 luasocket,而后者又加载了 Lua5.1 DLL 或找不到所需的符号。)
如果您不想编译 luasocket,您可以从此文件夹及其子文件夹中获取适用于 Windows/OSX/Linux 的二进制文件;只需确保这些库在任何可能针对 Lua5.1 编译 luasocket 的文件夹之前位于 LUA_CPATH 中。
[基于聊天讨论更新]您可能遇到多个 VM 问题的原因是您的应用程序可能是静态编译 Lua 解释器。然后加载 luasocket(直接或通过 mobdebug),它是针对 lua52.dll 编译的,它会加载解释器的另一个副本。为避免这种情况,您有两种选择:(1)将 luasocket 编译到您的应用程序中,就像您包含 lua 解释器本身一样;除了一个 mobdebug.lua 文件来调试您的应用程序之外,您不需要其他任何东西,或者 (2) 使用代理 dll;它看起来像 lua52.dll,但实际上会将您的调用代理到静态编译的 lua 库,从而避免多个 VM 出现问题。代理 dll适用于Lua 5.1,但您可以调整脚本以使其适用于 Lua 5.2。
(如果您的解释器不是静态编译的,如果您加载的 Lua DLL 的名称与 lua52.dll 不同,您仍然可能会得到两个解释器。)
为了响应 OP 的评论请求,您应该如何从 C++ 打开 lua 标准库“base”:
#include "lua.hpp"
//...
int main ()
{
lua_State* L = luaL_newstate();
luaL_requiref(L, "base", luaopen_base, 0);
// ...
int error = luaL_loadfile(L, mainLua);
lua_call(L, 0, 0);
lua_close(L);
}
请注意,您可以通过替换一次打开所有标准库:
luaL_requiref(L, "base", luaopen_base, 0);
和
luaL_openlibs(L);
Lua 5.2 参考手册第 6 节对此有更多信息。