問題: 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 をデバッグするためのリソースは非常に限られています。