调试嵌入式 Lua 5.2.2 代码



如何调试嵌入在C++应用程序中的Lua 5.2.2代码?

我已经看过这个问题,其中提供的所有 IDE 都处理 5.1 及更低版本,当我尝试将它们与 5.2.2 一起使用时,它们会崩溃。

您应该能够按照Lua 5.2调试说明使用ZeroBrane Studio调试应用程序。请注意,您需要针对 Lua5.2 编译 luasocket。(您看到的崩溃可能是因为您的应用程序加载了针对 Lua5.1 编译的 luasocket,而 luasocket 又加载了 Lua5.1 DLL 或无法找到所需的符号。

如果你不想编译luasocket

,你可以从这个文件夹及其子文件夹中获取Windows/OSX/Linux的二进制文件;只要确保这些库在任何可能针对Lua5.1编译luasocket的文件夹之前LUA_CPATH。

[根据聊天讨论更新] 您可能遇到多个 VM 问题的原因是您的应用程序可能是静态编译 Lua 解释器。然后加载luasocket(直接或通过mobdebug),它是针对lua52.dll编译的,它加载解释器的另一个副本。为了避免这种情况,您有两种选择:(1) 将 luasocket 编译到您的应用程序中,就像您包含 lua 解释器本身一样;除了一个 MobTee.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 节提供了有关此内容的更多信息。

最新更新