调试嵌入式 Lua 5.2.2 代码

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

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

点赞
用户1442917
用户1442917

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

如果您不想编译luasocket,您可以从此文件夹及其子文件夹中获取Windows/OSX/Linux二进制文件。只需确保这些库在LUA_CPATH中优先于可能针对Lua5.1编译的任何文件夹。

[根据聊天讨论进行更新] 您可能遇到多重VM问题的原因是您的应用程序可能静态编译了Lua解释器。然后您加载了针对lua52.dll编译的luasocket(直接或通过mobdebug),它加载另一个解释器的副本。为了避免这种情况,您有两个选择:(1)将luasocket编译到您的应用程序中,就像您包含lua解释器本身一样。您将不需要任何其他东西,只需一个mobdebug.lua文件即可调试您的应用程序;或者(2)使用代理dll。它看起来像是lua52.dll,实际上它会将您的调用代理到静态编译的lua库,避免了多重VM问题。代理dll适用于Lua 5.1,但您可以调整脚本使其适用于Lua 5.2。

(如果您的解释器未静态编译,则仍然可能出现两个解释器,如果您加载的Lua DLL与lua52.dll的命名不同。)

2013-09-08 05:45:33
用户234175
用户234175

针对 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 章

2013-09-09 01:57:19