如何远程调试 Lua?

我正在寻找远程调试Lua的最佳方法(比如通过Web浏览器)。

我看到了[RemDebug](http://www.keplerproject.org/remdebug/),但是该项目最后更新是在2006年。它适用于Lua 5.0和5.1,但Lua 5.2非常接近,我不认为RemDebug会很快得到更新。

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

欢迎提供建议。

原文链接 https://stackoverflow.com/questions/5438751

点赞
stackoverflow用户194106
stackoverflow用户194106

我不能确定你是需要远程调试 Lua 还是询问通过 HTTP 远程调试 Lua 的方法;我回答前者并不知道通过 HTTP 如何实现。

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

Decoda 可以通过神奇的方法,在不对 Lua VM 进行任何更改的情况下远程调试;而对于 LuaEdit,您需要以特定方式创建 VM,使用提供的 DLL 或库。

2011-04-01 10:54:19
stackoverflow用户700273
stackoverflow用户700273

这是以下脚本(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 远程调试器 运行您要调试的程序 此时,您可以在另一个窗口中运行目标程序(假设您在 Windows 系统上的 C:\ development\kepler 中运行 test.lua):

%lua50 test.lua 现在回到您运行 controller.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 运行 你随时可以更改应用程序窗口,以查看它的输出。回到调试器会话:

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

运行 在文件 C:/development/kepler/test.lua 第19行暂停 eval tab.foo 2 eval tab.bar 2 exec old_tab = tab nil exec tab = 2 nil eval tab 2 exec tab = old_tab nil eval tab.foo 2 运行 在文件 C:/development/kepler/test.lua 第19行暂停 eval tab.foo 4 delb test.lua 19 setw tab.foo == 32 插入观察表达式编号1 运行 在文件 C:/development/kepler/test.lua 第17行暂停 (观察表达式1:[tab.foo = 32]) eval tab.foo 32 delw 1 运行 程序已结束

2011-04-10 09:28:11
stackoverflow用户590518
stackoverflow用户590518
2011-04-12 10:22:00
stackoverflow用户871455
stackoverflow用户871455

不知道为什么需要通过 web 浏览器进行调试(这个想法对我来说有些奇怪,也许你可以详细解释一下为什么需要一个网页浏览器调试器?)

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

它通过 socket API 与被调试的程序通信,因此任何网络连接都可以,不需要 HTTP。

希望这可以帮到你。

2011-07-31 10:39:10
stackoverflow用户1442917
stackoverflow用户1442917

我基于 RemDebug (MobDebug)开发了一个新的调试器,加入了新的命令、新特性、错误修复和与 IDE 的集成。

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

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

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

可能可以模仿现有的 socket 接口(因为它只使用连接/发送/接收和选择/超时来中止应用程序),并重用大部分库。尽管可以在支持 TCP 的任何设备上运行应用程序(我有一个正在运行于移动设备上的应用程序,并从我的桌面运行的调试器工作原型),但我仍不确定为什么您想要在浏览器中运行此应用程序。

2012-06-14 05:09:45