【问题标题】:How to debug Lua remotely?如何远程调试 Lua?
【发布时间】:2011-03-25 22:25:09
【问题描述】:

我正在寻找远程调试 Lua 的最佳方式(例如从网络浏览器)。

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

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

欢迎提出建议。

【问题讨论】:

  • 我不确定我是否理解您为什么需要基于 Web 浏览器的客户端。基于完整调试器的客户端对您有好处吗?
  • 嘿,我在游戏开发部门工作,我需要一些通用的东西,我可以在多种架构上编译和运行。制作一个基于 Web 浏览器的客户端对我来说是理想的。

标签: debugging http lua


【解决方案1】:

我开发了一个基于 RemDebug (MobDebug) 的新调试器,其中包含新命令、新功能、错误修复以及与 IDE 的集成。

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

调试过程的架构相当简单:

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

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

【讨论】:

  • 我真的很喜欢我在这里看到的……我会试试看的!
  • 您的调试器看起来很棒!是否有针对初学者的教程(我已经看过示例文件夹)?有些事情不是不言自明的,help 不是那么彻底。
  • @Atcold,您可能需要查看this overview 和其他debugging-related links。它们是从 IDE 用户的角度出发的,但由于所有这些功能都基于 MobDebug 提供的功能,因此它可以让您更深入地了解它的工作原理。
【解决方案2】:

【讨论】:

    【解决方案3】:

    我不确定您是否需要远程调试 lua 或询问是否通过 HTTP 这样做;我正在回答前者,但我不知道通过 HTTP 这样做的方法。

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

    Decoda 可以为 lua 虚拟机发挥作用,无需对虚拟机进行任何更改;使用 LuaEdit,您需要使用提供的 DLL 或库以特定方式创建 VM。

    【讨论】:

    • 这不是基于网络的......我正在考虑自己开发基于网络的客户端,但我需要一些指针。
    【解决方案4】:

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

    来源: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 控制器.lua Lua 远程调试器 运行您要调试的程序 此时您可以运行您的目标程序(在另一个窗口中):

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

    在文件 C:/development/kepler/test.lua 处暂停 输入命令的“帮助”

    basedir C:/development/kepler/ 新的基础目录是 C:/development/kepler/ 基于的 C:/开发/开普勒/ 步 在文件 C:/development/kepler/test.lua 第 6 行暂停 超过 在文件 C:/development/kepler/test.lua 第 7 行暂停 超过 在文件 C:/development/kepler/test.lua 第 10 行暂停 超过 在文件 C:/development/kepler/test.lua 第 15 行暂停 setb test.lua 19 跑 您可以随时切换到应用程序窗口以查看其输出。回到调试器会话:

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

    运行 在文件 C:/development/kepler/test.lua 第 19 行暂停 评估 tab.foo 2 评估标签栏 2 执行 old_tab = 选项卡 零 执行选项卡 = 2 零 评估选项卡 2 执行选项卡 = old_tab 零 评估 tab.foo 2 跑 在文件 C:/development/kepler/test.lua 第 19 行暂停 评估 tab.foo 4 删除测试.lua 19 setw tab.foo == 32 插入手表 exp 编号。 1 跑 在文件 C:/development/kepler/test.lua 第 17 行暂停 (观察表达式 1:[tab.foo = 32]) 评估 tab.foo 32 露水 1 跑 程序结束

    【讨论】:

    • 在最初的问题中,我指定我看到了 RemDebug,但是 Lua 5.2 非常接近,而且我看不到 RemDebug 很快就会得到更新。我真的不认为这是我问题的合适答案。
    【解决方案5】:

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

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

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

    希望这会有所帮助。

    【讨论】:

    • 这听起来很有趣,但我需要一个开源解决方案来了解如何做到这一点。 (问题是“如何远程调试 lua”)谢谢。
    猜你喜欢
    • 1970-01-01
    • 2023-03-20
    • 2017-09-20
    • 2014-03-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    相关资源
    最近更新 更多