通过重定向stdin和stdout调试webrick生成的子ruby cgi进程

时间:2019-07-18 15:58:34

标签: ruby-on-rails ruby cgi webrick byebug

问题:byebug或pry输出通过HTTP而不是在控制台上返回。

我有一个 webrick.rb 脚本,该脚本具有一个CGIHandler,并通过该脚本传递了 dispatch.fcgi 脚本:

  

server.mount(“ /”,WEBrick :: HTTPServlet :: CGIHandler,File.expand_path(File.dirname( FILE ))+“ / dispatch.fcgi”)

因此,webrick通过_do_GET_方法将每个HTTP请求传递给此脚本。

根据

的此代码段,此方法使用IO :: popen生成子进程

/usr/local/rvm/rubies/ruby-2.2.10/lib/ruby/2.2.0/webrick/httpservlet /cgihandler.rb

class CGIHandler < AbstractServlet
      Ruby = RbConfig.ruby # :nodoc:
      CGIRunner = "\"#{Ruby}\" \"#{WEBrick::Config::LIBDIR}/httpservlet/cgi_runner.rb\"" # :nodoc:

      ##
      # Creates a new CGI script servlet for the script at +name+

      def initialize(server, name)
        super(server, name)
        @script_filename = name
        @tempdir = server[:TempDir]
        @cgicmd = "#{CGIRunner} #{server[:CGIInterpreter]}"
      end

      # :stopdoc:

      def do_GET(req, res)
        cgi_in = IO::popen(@cgicmd, "wb")

当我在源代码文件中使用 byebug binding.pry 时,它们的 stdout 返回到父进程,然后该父进程返回最终由 dispatch.fcgi 脚本提供,并因此通过HTTP返回。显然这是没有用的,因为我无法与之交互。

要解决此问题,我的想法是让byebug而不是使用不同的IO流,而不是stdout和stdin,或者以某种方式将其重定向到/ dev / pts下的其他文件描述符。然后,我可以编写一个小的console.rb脚本来代替与那些文件描述符/ IO流进行交互,这样我就可以与byebug或pry进行交互。

我是红宝石,byebug / pry和webrick的新手,我的想法听起来很复杂。我真的不知道如何实现这一目标(例如,如何在OS中创建新的文件描述符),而且我敢肯定肯定有比黑客破解byebug / pry gem和OS混乱的方法更简单的方法吗? 用于调试CGI的资源非常有限。

0 个答案:

没有答案