调试嵌入式Lua

时间:2009-04-23 05:56:20

标签: c++ debugging lua

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

从我收集的内容来看,我需要购买一个特殊的IDE并链接到他们特殊的lua运行时(ugh)。或者我需要使用lua debug API调用在游戏引擎中构建调试控制台。

我倾向于编写自己的调试控制台,但似乎需要做很多工作。是时候我可以更好地完善游戏的其他部分了。

6 个答案:

答案 0 :(得分:10)

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

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

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

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

令我惊讶的是,在使用Lua时,我很少感到需要调试器。我已经在其中为各种项目构建了几个小应用程序,并且惊讶于完整堆栈回溯和偶尔print调用的组合如何有效地找到require "strict"未阻止的错误第一名。

答案 1 :(得分:6)

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

答案 2 :(得分:3)

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

编辑:对不起,我不得不关闭网站,因此该软件无法再下载了。如果我找到时间,我可能会在以后将其作为开源软件发布。

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:2)

我没有看到调试DebuggerBreak应该如何工作,因为这是特定于.NET的。我认为只适用于以CLR为目标的分叉Lua。

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

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

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

答案 5 :(得分:0)

如果你使用的是Windows和VS - 你能使用我们使用的技巧吗?

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