你如何调试嵌入在 c++ 应用程序中的 lua 代码?
据我所知,要么我需要购买一个特殊的 IDE 并链接到他们特殊的 lua 运行时(呃)。或者我需要在游戏引擎中构建一个调试控制台,使用lua 调试 API调用。
我倾向于编写自己的调试控制台,但这似乎需要做很多工作。我可以更好地花时间来完善游戏的其他部分。
你如何调试嵌入在 c++ 应用程序中的 lua 代码?
据我所知,要么我需要购买一个特殊的 IDE 并链接到他们特殊的 lua 运行时(呃)。或者我需要在游戏引擎中构建一个调试控制台,使用lua 调试 API调用。
我倾向于编写自己的调试控制台,但这似乎需要做很多工作。我可以更好地花时间来完善游戏的其他部分。
有几个浮动的工具至少可以完成您想要的部分工作。我看到了对 VS 插件的引用,在 Lua for Windows 中有一个 SciTE 调试器扩展,还有 Kepler 项目的RemDebug以及他们的LuaEclipse。
RemDebug 可能会满足您的需求,因为它是为调试用 Lua 编写的 CGI 脚本而构建的。它确实需要访问 LuaSocket 模块以提供目标脚本和控制器以及其他几个模块之间的通信通道。
更大的问题可能是从游戏引擎放置在脚本周围的任何沙箱中加载任意模块的能力。如果您对引擎有一定的控制权,那么这将不是什么大问题。
例如,Adobe Lightroom 插件的开发人员目前无法做到这一点,因为 Lightroom 不会require
在插件的沙箱内公开。
令我惊讶的是,在使用 Lua 时,我很少感到需要调试器。我已经在其中为各种项目构建了几个小型应用程序,并且惊讶于完整的堆栈回溯和偶尔print
调用的组合可以很好地定位require "strict"
最初没有阻止的错误。
德科达怎么样??有一个视频解释了如何使用它,它对于嵌入式 lua 源非常有效。(我是一个快乐的客户)。而且很便宜。
您不需要编写自己的控制台,因为您可能希望从现有控制台之一开始。已经建议使用 RemDebug;我一直在开发 MobDebug,它是一个基于 RemDebug 的调试器,但具有许多新功能和错误修复。更改的详细列表在README中。
在您的脚本中启用调试可能就像添加一样简单require('mobdebug').start()
(如果您在同一台机器上运行您的应用程序和调试器服务器)。这应该尝试连接到在 localhost 上的默认端口上侦听的调试器。您可以使用 MobDebug 中包含的命令行界面,也可以使用ZeroBrane Studio,这是一个与 MobDebug 集成以提供调试功能的 Lua IDE。IDE 支持对 Love2d、Moai 和其他 Lua 引擎的调试,并且可能也适用于您的设置。
您可以使用我的调试器:GRLD(图形远程 lua 调试器)。与 RemDebug 一样,它使用套接字连接,但与 RemDebug 不同,它具有漂亮的图形界面。提供了源代码,因此您可以使其在任何平台上运行。它适用于标准 lua 运行时。非商业用途免费。
编辑:对不起,我不得不关闭网站,所以该软件不再可供下载。如果我有时间的话,我可能会在以后将它作为开源软件发布。
编辑 2:链接已更新,现在在 MIT 许可下托管在 github 中(开源)
我看不出调用 DebuggerBreak 应该如何工作,因为那是 .NET 特定的。我会假设它只适用于针对 CLR 的分叉 Lua。
如果您使用标准 Lua,您可以通过调用 lua 函数 debug.debug() 获得一些基本的调试工具。这会将 Lua 扔到您的控制台中,因此如果您从控制台运行 lua,您应该能够以交互方式发出 lua 命令来检查您的当前状态。debug.debug() 不会将您放入当前堆栈帧,因此您必须使用 debug.getlocal() 来读取变量的值。
我自己还没有尝试过,但我实际上并不认为制作自己的可行调试控制台有那么大的工作量。请记住,Lua 不像 C++ 那样复杂,所以这样做比制作真正的 C++ 调试器(比如 gdb)要容易得多。
我认为已经有很多人做过类似的事情,你可以看看谁的代码。这是仅用 lua 编写的 CLI 调试器。只有一个lua文件。不应该硬使用和修改您的需要。
如果您使用的是 windows 和 VS - 您可以使用我们使用的技巧吗?
将 lua 代码复制到文件中。然后在 lua 代码中调用 Debugger api(在 C++ 中,DebuggerBreak()
我认为这是 - 请参见此处)。然后当 lua 代码执行时,调试器将启动,您应该能够指定文件。然后正常调试?