【问题标题】:Lua Debugger that can Attach to Process可以附加到进程的 Lua 调试器
【发布时间】:2012-01-15 04:33:47
【问题描述】:

我的公司有一个程序,它使用嵌入在其运行时中的 Lua,从磁盘加载 .lua 文件并重复执行其中定义的函数。

有没有办法附加到正在运行的进程并在我的.lua 文件中设置断点? (我会接受 gdb 风格的命令行调试作为 Lua 发行版的一部分,或者可能是提供类似 Visual-Studio 的 GUI 断点的第三方 IDE。)

或者考虑到运行时从磁盘加载随机文件的性质,我所要求的完全是荒谬和不可能的?

编辑:看起来这不是无稽之谈,因为 Lua 自己的 debug.getinfo() 函数可以确定给定函数的源文件,而 debug.sethook() 允许对输入的每一行新代码进行回调.因此,从磁盘加载源代码并能够判断解释器何时执行该文件中的特定代码行是合理的。问题仍然存在:如何锁定具有 Lua 解释器的现有进程并注入我自己的跟踪函数(然后可以监视文件/行号对并暂停执行)?

【问题讨论】:

    标签: lua


    【解决方案1】:

    如果您可以修改 .lua 文件,则可以在需要调试的任何内容之前插入以下调用:

    require 'remdebug.engine'.start()
    

    它启动RemDebug Lua 调试器引擎并尝试连接到控制器。如果无法连接,它将继续正常运行。我对调试器引擎做了some fixes,比如处理临时变量,而我的学生正在开发调试器 GUI(明年到期)。

    与此同时,您可以尝试Lua Development Tools 是否适合您。它有一个类似于 RemDebug 的debugger,应该可以如下设置:

    require("debugger")(host, port, idekey)
    

    或者,您可以使用SciTE-debug,它是 SciTE 编辑器的扩展,可以用作 RemDebug 的控制器。只需确保在 Lua 代码中的某处插入对 remdebug.engine.start 的调用,然后将其插入 SciTE 输出窗口:

    :debug.target=remote.lua
    

    当您启动程序时,SciTE 应该显示源代码和当前行。

    【讨论】:

      【解决方案2】:

      为此,我一直在使用 Decoda 编辑器。它允许您附加到正在运行的 C++ 应用程序,之后它会检测到您正在 C++ 代码中运行 Lua 解释器并显示您的 Lua 源代码,您可以在其中像往常一样添加喙点和检查变量。

      【讨论】:

        【解决方案3】:

        这是我经过大量搜索后使用的替代方法。如果您有一个加载 lua 的外部可执行文件,我会在几分钟内完成这项工作。该操作非常敏感,它有一个交互式调试器,可以加载您的代码,您可以交互式地放置调试点。它没有编辑器,但我使用 scite 或 crimson 编辑器并启动可执行文件,主 lua 模块中的一行启用调试器。

        http://www.cushy-code.com/grld/ - 这个链接现在好像失效了

        我已移至 eclipse.org/ldt,它有一个 ide 和集成调试器,推荐

        【讨论】:

        • 我已经搬到eclipse.org/koneki/ldt 它有一个IDE和集成调试器,推荐
        • 上面的链接失效了。
        【解决方案4】:

        Lua plugin for IntelliJ 有一个可以工作的调试器,除了指向你的 Lua 解释器外,不需要任何特殊设置。

        这是它的截屏视频:

        http://www.screencast.com/t/CBWIkoZPg

        【讨论】:

        • 我可以用这种方式调试简单的东西,但我不知道如何调试“破坏”的单元测试。有什么建议吗?
        【解决方案5】:

        与 Michal Kottman 所描述的类似,我已经实现了一个基于 RemDebug 的调试器,但具有额外的修复和功能(在 github 上:https://github.com/pkulchenko/MobDebug)。

        您可以在您希望开始调试的位置使用require("mobdebug").start("localhost", 8171) 更新您的 .lua 文件。然后,您可以使用命令行调试器来执行命令、设置断点、评估/执行表达式等等。

        作为替代方案,您可以使用ZeroBrane Studio IDE,它与调试器集成,并为您提供了一个前端来加载代码并在漂亮的 GUI 中执行相同的调试器命令。如果您想查看 IDE 的实际运行情况,我在这里有一个简单的演示:http://notebook.kulchenko.com/zerobrane/live-coding-in-lua-bret-victor-style

        【讨论】:

          【解决方案6】:

          您可能应该使用Decoda
          转到Debug -> Processes -> Attach 附加您的流程。这应该可以正常工作。

          【讨论】:

            【解决方案7】:

            嗯,最简单的方法就是这样,感谢天才作者 https://github.com/slembcke/debugger.lua

            你不需要设置远程调试服务器,只需要一个文件,然后简单地调用 dbg() 就会暂停,就像 gdb 一样

            还附带了教程,请查看。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 2012-09-15
              • 2014-05-05
              • 1970-01-01
              • 2019-08-12
              • 2018-09-23
              • 2019-01-31
              相关资源
              最近更新 更多