如何远程调试Lua?

13

我正在寻找远程调试Lua的最佳方法(例如从Web浏览器中进行调试)。

我看到了RemDebug,但是该项目的最后一次更新是在2006年。它适用于Lua 5.0和5.1,但Lua 5.2非常接近,我不认为RemDebug会很快得到更新。

我可以在我的调试主机上挂载一个小型嵌入式Web服务器,使用类似RemDebug的东西与其通信,并通过HTTP进行远程调试。

欢迎提出建议。


我不确定我理解为什么你需要基于Web浏览器的客户端。一个基于完整调试器的客户端对你来说好吗? - Uri Cohen
嗨,我从事游戏开发工作,我需要一些通用的东西,可以在多个架构上编译和运行。对我来说,制作一个基于Web浏览器的客户端是理想的选择。 - Goles
5个回答

12

我基于 RemDebug(MobDebug) 开发了一个新的调试器,增加了新的命令、新特性、修复了 bug,并与 IDE 进行了集成。

MobDebug 基于客户端(被调试者)和服务器(控制器)之间的 TCP 交互,这也适用于 RemDebug 和其他大多数远程调试器。你可能能够在其他协议之上运行(例如 WebSockets 或 HTTP),但仍需要能够运行协程和调试钩子来控制被调试的应用程序。

调试过程的架构非常简单:

  • 你有一个想要调试的应用程序
  • 你还有带有控制器的调试器
  • 应用程序加载调试器的客户端组件,打开到控制器的连接
  • 控制器接受来自命令行或 IDE 的命令(MobDebug 两者都提供;它与 ZeroBraneStudio 集成,并提供可编写脚本的方式来运行它)
  • 当应用程序加载时,调试器安装一个调试钩子,在每个行/调用/返回上运行。从此调试钩子中,会向调试器发出 resume 调用,调试器可以执行控制器的命令(例如安装断点、评估表达式等)。当发送下一个可执行命令时(例如运行或步进),调试器将返回到钩子,然后返回到应用程序,以允许其继续执行。

可能可以模仿现有的 socket 接口(因为它只使用 connect/send/receive 和 select/timeout 来中止应用程序),并重用大部分库。但我仍不确定为什么你想在浏览器中运行它,因为你已经可以在支持 TCP 的任何设备上运行应用程序(我有一个工作原型,在我的桌面上调试运行在移动设备上的应用程序)。


我真的很喜欢这里看到的东西... 我会试一试! - Goles
你的调试器看起来很棒!有没有针对初学者的教程(我已经看过示例文件夹了)?有些东西不是很容易理解,而且“帮助”也不是很详细。 - Atcold
@Atcold,你可能想要查看这个概述和其他调试相关链接。它们是从IDE用户的角度来看的,但由于所有这些功能都是基于MobDebug提供的,因此它可能会让你对其工作原理有更多的了解。 - Paul Kulchenko


1

我不确定这是否正确。但希望它能有所帮助:

源代码:http://www.keplerproject.org/remdebug/example.html

这是以下脚本(test.lua)的调试会话示例:

 1    require"remdebug.engine"
 2
 3    remdebug.engine.start()
 4    
 5    local tab = {
 6      foo = 1,
 7      bar = 2
 8    }
 9
10    print("Start")
11
12    function bar()
13      print("In bar 1")
14      print("In bar 2")
15    end
16
17    for i = 1, 10 do
18      print("Loop")
19      bar()
20      tab.foo = tab.foo * 2
21    end
22
23    print("End")

首先运行RemDebug控制器:

% lua50 controller.lua Lua远程调试器 运行您想要调试的程序 此时,您可以在另一个窗口中运行目标程序:

% lua50 test.lua 现在回到您运行controller.lua的窗口(假设您正在Windows系统上的C:\development\kepler中运行test.lua):

暂停在文件C:/development/kepler/test.lua处 键入“help”以获取命令

basedir C:/development/kepler/ 新基本目录为C:/development/kepler/ basedir C:/development/kepler/ step 暂停在文件C:/development/kepler/test.lua第6行 over 暂停在文件C:/development/kepler/test.lua第7行 over 暂停在文件C:/development/kepler/test.lua第10行 over 暂停在文件C:/development/kepler/test.lua第15行 setb test.lua 19 run 您可以随时切换到应用程序窗口以查看其输出。返回调试器会话:

暂停在文件C:/development/kepler/test.lua第19行

运行 在文件C:/development/kepler/test.lua的第19行暂停 评估tab.foo 2 评估tab.bar 2 执行old_tab = tab nil 执行tab = 2 nil 评估tab 2 执行tab = old_tab nil 评估tab.foo 2 运行 在文件C:/development/kepler/test.lua的第19行暂停 评估tab.foo 4 删除test.lua的第19行 设置watch exp no. 1为tab.foo == 32 插入观察表达式1 运行 在文件C:/development/kepler/test.lua的第17行暂停 (观察表达式1:[tab.foo = 32]) 评估tab.foo 32 删除观察表达式1 运行 程序完成

1
在原问题中,我指定了我看到了RemDebug,但Lua 5.2非常接近,我不认为RemDebug会很快得到更新。我并不认为这是对我的问题的合适回答。 - Goles

1

我不确定您是否需要远程调试lua或者询问如何通过HTTP进行调试;我回答的是前者,而且我不知道有没有一种方法可以通过HTTP进行调试。

LuaEditDecoda都允许您远程连接到正在运行的lua脚本(无论是在同一台机器上的不同进程还是在远程机器上)。

Decoda可以做魔法,并且可以在不需要对VM进行任何更改的情况下为lua VM执行此操作;使用LuaEdit,您需要以特定方式创建VM,使用提供的DLL或库。


这些不是基于网络的...我在考虑自己开发基于网络的客户端,但我需要一些指导。 - Goles

0

不知道为什么需要Web浏览器调试(这个想法对我来说有点奇怪,也许您可以详细说明为什么需要Web浏览器调试?)

然而,对于独立的调试器,我编写了一个带有GUI的远程调试器:http://cushy-code.com/grld

它使用套接字API与被调试程序通信,因此任何网络连接都可以,无需HTTP。

希望这可以帮到您。


2
这听起来非常有趣,但我需要一个开源解决方案才能理解如何做到这一点。(问题是“如何远程调试lua”)谢谢。 - Goles

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接