如何在Ruby 1.9中从程序中调用Ruby调试器?

3
我正在为 Ruby 编写一个基于 Web 的调试器,但是为了做到这一点,我需要能够从服务器端的 Ruby 程序中调用 Ruby 调试器。这种方法是否可行?是否有过类似的实现?
最终产品将允许使用 Web 浏览器编辑、执行和单步运行 Ruby 代码。要调试的 Ruby 代码将在服务器端进行 "eval"。
有一个 stackoverflow 用户向我指出了正确的方向,建议我使用 popen 或 expect。我现在已经尝试了这两种方法,但遇到了以下问题: popen:当等待控制台时,必须使用超时块来信号结束调试控制台的输出(命令行终端可以检测到,那么为什么 Ruby 不能)。
expect:在下面的程序中,调试器输入与调试器不同步。为什么会这样?

你能详细说明一下你想要做什么吗? - Geo
我正在尝试从Web浏览器调试Ruby代码,这是Web IDE的一部分。 - yazzapps.com
2个回答

1

我认为你可以利用ruby-debug。我想象这就像在服务器端打开同一个脚本,并向其发送按键。我觉得这是我会做的事情。

从这个角度来看:客户端将代码粘贴到您的表单中。他可以选择单击某个按钮,在某些行上设置断点。然后,他提交整个内容。在服务器端,您处理该表单,并创建一个包含表单内容的.rb文件。在他放置断点的行上,您插入一个debugger调用。然后运行:

ruby client_script.rb

这将在到达debugger行时停止进程。我建议您使用Expect for Ruby或其他工具完成所有操作。因此,当客户在页面上按下step over或检查任何变量时,您会向生成的进程发送按键。

例如,如果他想检查变量x的值,您将把以下内容发送到进程:

p x

然后,您需要捕获该输出并将其发送回客户端的浏览器。 Expect有点像popen,但更好一些。


抱歉,我没有正确理解你的答案... 重新阅读后,我明白你建议发送按键到“ruby-debug”。我会进一步研究这个问题,因为我甚至没有意识到这是可能的。 - yazzapps.com
啊,明白了,显然对于1.9需要执行:gem install ruby-debug19:末尾的19有所不同。我现在会继续我的调查! - yazzapps.com
糟糕,现在我发现 expect 和 popen 都不存在于 1.9 的宝石中,也许我应该只是复制并粘贴你在链接中展示给我的 "expect" 代码。顺便说一句,我想为你的答案加分,但 stackoverflow 告诉我我还没有足够的 15 分,所以暂时无法奖励你。不过一旦我有了足够的积分,我会给你加上的。 - yazzapps.com
没问题,慢慢来。也许你可以只使用 popen 模块就能处理好了。你可以在这里找到使用示例:http://whynotwiki.com/Ruby_/_Process_management - Geo
嗨,我稍微修改了问题。尽管我需要的popene或expect仍无法正常工作。 - yazzapps.com
显示剩余7条评论

0

我终于想出了如何使用expect来完成这个任务:

require 'pty'
require 'expect'
PTY.spawn("rdebug deb.rb") do |output,input,pid| while true do begin buffer = "" puts "-------" puts output.readpartial(1024,buffer) until buffer =~ /\(rdb:1\)/ a = gets input.puts a rescue break end end end

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