【问题标题】:Debugging embedded Lua调试嵌入式 Lua
【发布时间】:2010-10-21 07:04:53
【问题描述】:

如何调试嵌入在 c++ 应用程序中的 lua 代码?

据我所知,要么我需要购买一个特殊的 IDE 并链接到他们特殊的 lua 运行时(呃)。或者我需要在游戏引擎中构建一个调试控制台,使用 lua debug API 调用。

我倾向于编写自己的调试控制台,但这似乎需要大量工作。我可以更好地花时间来完善游戏的其他部分。

【问题讨论】:

    标签: c++ debugging lua


    【解决方案1】:

    有几种工具可以至少完成您想要的部分工作。我看到了对 VS 插件的引用,在 Lua for Windows 中有一个 SciTE 调试器扩展,还有 Kepler 项目的RemDebug,以及他们的LuaEclipse

    RemDebug 可能会满足您的需求,因为它是为调试用 Lua 编写的 CGI 脚本而构建的。它确实需要访问 LuaSocket 模块以提供目标脚本和控制器以及其他几个模块之间的通信通道。

    更大的问题可能是从游戏引擎放置在脚本周围的任何沙箱中加载任意模块的能力。如果您对引擎有一定的控制权,那么这将不是什么大问题。

    这对于 Adob​​e Lightroom 插件的开发人员来说目前是不可能的,例如,因为 Lightroom 不会在插件的沙箱中公开 require

    令我惊讶的是,在使用 Lua 时,我很少感到需要调试器。我已经在其中为各种项目构建了几个小型应用程序,并且惊讶于完整的堆栈回溯和偶尔的print 调用的组合可以很好地定位require "strict" 最初没有阻止的错误。

    【讨论】:

    • RemDebugger 几乎正是我想要的。它应该可以按原样使用,并为我提供良好的自定义基础。
    【解决方案2】:

    Decoda??有一个视频解释了如何使用它,它对于嵌入式 lua 源非常有效。 (我是一个快乐的客户)。而且很便宜。

    【讨论】:

    • 我使用 Decoda,也很满意。它与您的项目无缝链接,无需任何设置。您甚至可以使用 Decoda 调试 Lua,同时使用另一个调试器调试 C++。我唯一的抱怨是开发人员(未知世界)手头有一个更高优先级的项目(自然选择 2),所以我的支持请求没有得到答复。 (事实证明我的问题不是 Decoda 的错)。另外,项目列表不支持树状视图,所以一旦你得到很多文件,它就会变成一个长列表。
    【解决方案3】:

    您不需要编写自己的控制台,因为您可能希望从现有控制台之一开始。已经建议使用 RemDebug;我一直在开发 MobDebug,它是一个基于 RemDebug 的调试器,但具有许多新功能和错误修复。更改的详细列表在README

    在您的脚本中启用调试可能就像添加require('mobdebug').start() 一样简单(如果您在同一台机器上运行您的应用程序和调试器服务器)。这应该尝试连接到在 localhost 上的默认端口上侦听的调试器。您可以使用 MobDebug 中包含的命令行界面,也可以使用 ZeroBrane Studio,这是一个与 MobDebug 集成以提供调试功能的 Lua IDE。 IDE 支持对 Love2d、Moai 和其他 Lua 引擎的调试,并且可能也适用于您的设置。

    【讨论】:

      【解决方案4】:

      您可以使用我的调试器:GRLD(图形远程 lua 调试器)。与 RemDebug 一样,它使用套接字连接,但与 RemDebug 不同,它具有漂亮的图形界面。提供了源代码,因此您可以使其在任何平台上运行。它适用于标准 lua 运行时。非商业用途免费。

      编辑:抱歉,我不得不关闭网站,所以该软件不再可供下载。如果我有时间的话,我可能会在以后将它作为开源软件发布。

      编辑 2:链接已更新,现在在 MIT 许可下托管在 github(开源)

      【讨论】:

        【解决方案5】:

        我看不出调用 DebuggerBreak 应该如何工作,因为那是特定于 .NET 的。我认为这只适用于针对 CLR 的分叉 Lua。

        如果您使用标准 Lua,您可以通过调用 lua 函数 debug.debug() 获得一些基本的调试工具。这会将 Lua 扔到您的控制台中,因此如果您从控制台运行 lua,您应该能够以交互方式发出 lua 命令来检查您的当前状态。 debug.debug() 不会让你进入当前堆栈帧,所以你必须使用 debug.getlocal() 来读取变量的值。

        我自己还没有尝试过,但我实际上并不认为制作自己的可运行调试控制台是一项繁重的工作。请记住,Lua 不像 C++ 那样复杂,所以这样做比制作真正的 C++ 调试器(比如 gdb)要容易得多。

        我认为已经有很多人做过类似的事情,你可以看看谁的代码。 Here 是仅用 lua 编写的 CLI 调试器。只有一个lua文件。不应该根据您的需要硬使用和修改。

        【讨论】:

          【解决方案6】:

          如果您使用的是 windows 和 VS - 您可以使用我们使用的技巧吗?

          将 lua 代码复制到一个文件中。然后在 lua 代码中调用 Debugger api(在 C++ 中,我认为这是 DebuggerBreak() - 请参阅 here)。然后当 lua 代码执行时,调试器将启动,您应该能够指定文件。然后正常调试?

          【讨论】:

          • 解决了一半的问题。我真正想做的是逐行执行lua代码。如果了解您的解决方案,我将能够在 lua 脚本中的任何行中断,但我将在 c++ 调试器中。我将如何检查本地 lua 变量等。
          • 我认为这是一个分为两个部分的问题 - 一个是简单的检查,这将很难,因为您将编写调试器扩展来执行此操作。第二种方法是确定 lua“引擎”如何存储这些值并手动或通过宏检查它们。
          猜你喜欢
          • 2013-09-11
          • 1970-01-01
          • 2020-08-24
          • 2012-04-27
          • 1970-01-01
          • 1970-01-01
          • 2019-01-25
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多