我的公司有一个程序,它在运行时嵌入了Lua,从磁盘加载.lua
个文件并重复执行它们中定义的函数。
有没有办法附加到正在运行的进程并在.lua
个文件中设置断点? (我接受gdb风格的命令行调试作为Lua发行版的一部分,或者可能是提供类似Visual-Studio的GUI断点的第三方IDE。)
或者,考虑到运行时加载来自磁盘的随机文件的性质,我要求的是完全荒谬和不可能的?
编辑:看起来它并不荒谬,因为Lua自己的debug.getinfo()
函数可以确定给定函数的源文件,debug.sethook()
允许每个新函数的回调输入的代码行。因此,从磁盘加载源代码并且能够告诉解释器何时从该文件执行特定代码行是合理的。问题仍然存在:如何锁定具有Lua解释器的现有进程并注入我自己的跟踪功能(然后可以查看文件/行号对并暂停执行)?
答案 0 :(得分:10)
如果您可以修改.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应显示源和当前行。
答案 1 :(得分:5)
我一直在使用Decoda编辑器。它允许您附加到正在运行的C ++应用程序,之后它会检测到您在C ++代码中运行Lua Interpreter并显示Lua源代码,您可以像往常一样添加beakpoints并检查变量。
答案 2 :(得分:4)
这是我经过多次搜索后使用的替代方案。如果你有一个加载lua的外部可执行文件,我会在几分钟内完成这项工作。操作非常灵敏,它有一个交互式调试器,可以加载代码,您可以交互地放置调试点。它没有编辑器,但我使用scite或crimson编辑器并启动可执行文件,主lua模块中的一行启用调试器。
http://www.cushy-code.com/grld/ - 此链接现在似乎已经死了
我已经转移到eclipse.org/ldt它有一个ide和集成调试器,推荐
HTH
答案 3 :(得分:3)
Lua plugin for IntelliJ有一个正常工作的调试器,除了指向Lua解释器之外,不需要任何特殊设置。
以下是它的截屏视频:
答案 4 :(得分:3)
类似于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。
答案 5 :(得分:1)
您应该使用Decoda
转到Debug -> Processes -> Attach
以附加您的流程。这应该可以正常工作。
答案 6 :(得分:-1)
最简单的方法就是天才作者 https://github.com/slembcke/debugger.lua
您不需要设置远程调试服务器,只需要一个文件,并简单地调用dbg(),它会暂停,就像gdb
教程也附带它,检查出来。