【问题标题】:Debugging embedded Lua 5.2.2 code调试嵌入式 Lua 5.2.2 代码
【发布时间】:2013-09-11 20:26:19
【问题描述】:

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

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

【问题讨论】:

    标签: c++ debugging ide lua lua-5.2


    【解决方案1】:

    您应该能够通过关注instructions for Lua 5.2 debugging 来使用ZeroBrane Studio 调试您的应用程序。请注意,您需要针对 Lua5.2 编译 luasocket。 (您看到的崩溃可能是因为您的应用程序加载了针对 Lua5.1 编译的 luasocket,而后者又加载了 Lua5.1 DLL 或找不到所需的符号。)

    如果你不想编译 luasocket,你可以从this folder and its subfolders 获取 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 出现问题。 proxy dll 适用于 Lua 5.1,但您可以调整脚本以使其适用于 Lua 5.2。

    (如果你的解释器不是静态编译的,如果你加载的 Lua DLL 的命名与 lua52.dll 不同,你仍然可能得到两个解释器。)

    【讨论】:

    • 这对我不起作用。我一调用 lua_call,我的程序就崩溃了。这就是我所做的,我将此代码放入我的 .lua 文件 package.path = package.path .. "C:/ZeroBraneStudio/lualibs/mobdebug/mobdebug.lua" package.cpath = package.cpath .. "C:/ZeroBraneStudio/bin/clibs52/socket/?.dll" require('mobdebug').start() 中,我得到的错误是 PANIC: unprotected error in call to Lua API (main.lua:3: attempt to index global 'package' (a nil value))
    • attempt to index global 'package' (a nil value):那么,您的环境中的package 全局发生了什么变化?
    • 另外,您可能需要添加...clibs52/mime/?.dll,因为它可能是从socket.lua 加载的,并且您要确保它是从clibs52 加载的。将故障排除讨论切换到ZeroBrane Studio maillist 可能更方便。
    • 我不知道,即使输入像 package.path = package.path .. ";../?.lua" 这样简单的东西也会导致同样的错误崩溃。我认为我缺少一个步骤。
    • @Caesar 您能想到任何可能将您的 package 表设置为 nil 或删除它的东西吗?或者也许是沙盒代码中正在运行的_ENV 的变化?当一个未捕获的 lua 错误被允许传播到 C 空间时,就会发生这种情况——它是 PANICS。
    【解决方案2】:

    响应 OP 的评论请求,以下是您应该如何从 C++ 打开 lua 标准库“基础”:

    #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 reference manual Section 6 有更多相关信息。

    【讨论】:

    • 谢谢,这似乎可以解决该错误,但我似乎还有另一个错误。 PANIC: unprotected error in call to Lua API (error loading module 'socket.core' from file 'C:/ZeroBraneStudio/bin/clibs52/socket\core.dll': The specified module could not be found. )我已经查看了那个位置,我可以通过复制和粘贴告诉你它在那里。
    • 您是否正在尝试调试嵌入 lua 的实际 C/C++ 应用程序?
    • 我做了一个房间,这样我们就可以讨论这个了,这样会干净得多。请加入我chat.stackoverflow.com/rooms/37030/…
    猜你喜欢
    • 2010-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-04-07
    • 1970-01-01
    • 1970-01-01
    • 2018-12-26
    • 2013-07-22
    相关资源
    最近更新 更多