1

问题: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")

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

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

我是 ruby​​、byebug/pry 和 webrick 的新手,我的想法听起来很复杂。我真的不知道如何实现这一点(例如,我如何在操作系统中创建新的文件描述符),我相信肯定有一些比破解 byebug/pry gem 和弄乱操作系统更简单的方法?调试 CGI 的资源非常少。

4

0 回答 0