1

問題: byebug または pry の出力が、コンソールではなく HTTP 経由で返されます。

dispatch.fcgiスクリプトが渡された CGIHandler がマウントされたwebrick.rbスクリプトがあります。

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

したがって、webrick は各 HTTP リクエストを _do_GET_ メソッドを介してこのスクリプトに渡します。

このメソッドは、次のコード スニペットに従って、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 経由で返されます。明らかに、私はそれとやり取りできないので、これは役に立ちません。

これを修正するには、stdout と stdin ではなく別の IO ストリームを使用するか、何らかの方法で /dev/pts の下の別のファイル記述子にリダイレクトするのではなく byebug を使用することを考えています。次に、代わりにこれらのファイル記述子/IO ストリームと対話する小さな console.rb スクリプトを作成し、この方法で byebug または pry と対話することができます。

Ruby、byebug/pry、webrick は初めてで、私の考えは複雑に聞こえます。これを実現する方法がよくわかりません (たとえば、OS で新しいファイル記述子を作成する方法など)。byebug/pry gem をハックして OS をいじるよりも簡単な方法があるに違いありません。CGI をデバッグするためのリソースは非常に限られています。

4

0 に答える 0