我正在为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
答案 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