我如何以编程方式从Ruby 1.9中的ruby程序中调用ruby调试器?

时间:2009-11-12 17:26:07

标签: ruby debugging

我正在为Ruby编写一个基于Web的调试器,但为了做到这一点,我需要能够在服务器端的Ruby程序中调用Ruby调试器。有没有这样做过?这甚至可能吗?

正在构建的最终产品将允许仅使用Web浏览器编辑,执行和逐步执行Ruby代码。要调试的ruby代码将在服务器端“eval”。

我已经被一个建议使用popen或expect的stackoverflow用户指向了正确的方向。我现在尝试了这两种方法,但遇到了以下问题:

popen:在等待控制台时,你必须使用一个超时块​​来指示调试控制台输出的结束(命令行终端可以检测到这一点,所以为什么不能ruby)。

期望:在下面的程序中,调试器输入与调试器不同步。那是为什么?

require 'pty'
require 'expect'

$expect_verbose = true
PTY.spawn("rdebug deb.rb") do |from_debugger, to_debugger, pid|

    a=nil

    while ( a != "end" ) do

        from_debugger.expect(/\(rdb:1\)/ ) do |input|

            a = gets
            to_debugger.puts( a + "\n" )

        end
        from_debugger.flush
    end

end

2 个答案:

答案 0 :(得分:1)

我认为你可以使用ruby-debug。我想这就是在服务器端打开相同的脚本,并向它发送击键。我想我就是这样做的。

以这种方式思考:客户端将其代码粘贴到您的表单中。或者,他可以单击某个按钮,在某些行上放置一个断点。然后他提出了整件事。在服务器端,您处理该表单,并使用表单的内容创建.rb文件。在他放置断点的行,您插入debugger电话。然后你运行:

ruby client_script.rb

一旦到达debugger行,这将停止该过程。我建议你用Expect for Ruby或其他什么来做这一切。因此,当客户端在页面上按step over或检查任何变量时,您会将键击发送到您生成的进程。 例如,如果他想检查变量x的值,则将其发送给流程:

p x

并且您必须捕获该输出并将其发送回客户端的浏览器。 Expect有点像popen,但更好一点。

答案 1 :(得分: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