diff options
author | David Heinemeier Hansson <david@loudthinking.com> | 2006-02-19 06:25:47 +0000 |
---|---|---|
committer | David Heinemeier Hansson <david@loudthinking.com> | 2006-02-19 06:25:47 +0000 |
commit | 03acf48817d38e8ec4078d50f6ab48a2dfc035b3 (patch) | |
tree | b23271a227c720cd3ae7c6289ef387ad8b27b4b5 /railties/lib/fcgi_handler.rb | |
parent | 8fb9d7cb4a2ae2bab862aa3e05753ddbdee37632 (diff) | |
download | rails-03acf48817d38e8ec4078d50f6ab48a2dfc035b3.tar.gz rails-03acf48817d38e8ec4078d50f6ab48a2dfc035b3.tar.bz2 rails-03acf48817d38e8ec4078d50f6ab48a2dfc035b3.zip |
Added SIGTRAP signal handler to RailsFCGIHandler that'll force the process into a breakpoint after the next request. This breakpoint can then be caught with script/breakpointer and give you access to the Ruby image inside that process. Useful for debugging memory leaks among other things [DHH]
git-svn-id: http://svn-commit.rubyonrails.org/rails/trunk@3618 5ecf4fe2-1ee6-0310-87b1-e25e094e27de
Diffstat (limited to 'railties/lib/fcgi_handler.rb')
-rw-r--r-- | railties/lib/fcgi_handler.rb | 26 |
1 files changed, 22 insertions, 4 deletions
diff --git a/railties/lib/fcgi_handler.rb b/railties/lib/fcgi_handler.rb index 0170d6904e..10f846fa13 100644 --- a/railties/lib/fcgi_handler.rb +++ b/railties/lib/fcgi_handler.rb @@ -5,10 +5,11 @@ require 'rbconfig' class RailsFCGIHandler SIGNALS = { - 'HUP' => :reload, - 'TERM' => :exit_now, - 'USR1' => :exit, - 'USR2' => :restart + 'HUP' => :reload, + 'TERM' => :exit_now, + 'USR1' => :exit, + 'USR2' => :restart, + 'SIGTRAP' => :breakpoint } attr_reader :when_ready @@ -61,6 +62,9 @@ class RailsFCGIHandler when :exit close_connection(cgi) break + when :breakpoint + close_connection(cgi) + breakpoint! end gc_countdown @@ -137,6 +141,11 @@ class RailsFCGIHandler @when_ready = :restart end + def breakpoint_handler(signal) + dispatcher_log :info, "asked to breakpoint ASAP" + @when_ready = :breakpoint + end + def process_request(cgi) Dispatcher.dispatch(cgi) rescue Object => e @@ -170,6 +179,15 @@ class RailsFCGIHandler Dispatcher.reset_application! ActionController::Routing::Routes.reload end + + def breakpoint! + require 'breakpoint' + port = defined?(BREAKPOINT_SERVER_PORT) ? BREAKPOINT_SERVER_PORT : 42531 + Breakpoint.activate_drb("druby://localhost:#{port}", nil, !defined?(FastCGI)) + dispatcher_log :info, "breakpointing" + breakpoint + @when_ready = nil + end def run_gc! @gc_request_countdown = gc_request_period |