Sometimes taking an app down for debugging purposes is just not an option. Luckily a new tool called Hijack can provide a live IRB prompt for an existing Ruby process in the same way that Erlang provides hot swapping of code (changing the definition of a system while the system is still up and running).
Hijack (it’s still in a beta state, so be careful and don’t use it in production yet!) lets you to pry your way into a running Ruby process, where it drops you into a live IRB session running over DRB. Gone are the days of stopping live applications just to make a minor update!
Using the GDB (GNU DeBugger), Hijack connects to the running Ruby process, injecting a small payload to start a DRB session which provides an IRB session:
$ ruby hijack 16451 => Hijacking... => Mirroring: 100% => Hijacked 16451 (my_script.rb) (ruby 1.8.7 [i686-darwin9]) >>
You may already be familiar with live-console which provides a similar functionality. The key difference, however, is that Hijack can “inject” itself into an existing Ruby process without needing the code to have included it explicitly. Developer Ian Leitch explains:
I’ve just changed Hijack so that you can hijack any Ruby process – no need for your target process to require any code before it can be hijacked. It does this by first injecting a payload using gdb, then it signals the process to start up a DRb server which the hijack client then connects to.