Exploring Ruby Internals with GDB
Install autoconf 2.68
Thanks to Jean-Sebastien Delfino for posting on his blog how to set this up on Mac OS X Mountain Lion
$ mkdir -p ~/devtools
$ cd ~/devtools
$ curl -OL http://ftpmirror.gnu.org/autoconf/autoconf-2.68.tar.gz
$ tar xzf autoconf-2.68.tar.gz
$ cd autoconf-2.68
$ ./configure --prefix=/Users/ken/devtools/autotools-bin
$ make
$ make install
$ export PATH=$PATH:/Users/ken/devtools/autotools-bin/bin
Grab latest Ruby source code
$ git clone git://github.com/ruby/ruby.git
Build and install Ruby
$ cd ruby
$ autoconf # no configure file available
$ ./configure --prefix=/Users/ken/devtools/ruby-bin
$ make
$ make install
Explore Ruby internals
Thanks to Howard Yeh for posting on his blog tips that got me started.
Terminal 1
$ /Users/ken/devtools/ruby-bin/irb
1.9.3-p286 :001 > Process.pid
=> 69983
Terminal 2
$ cgdb /Users/ken/devtools/ruby-bin/ruby 69983 # using cgdb, not gdb; same pid as one obtained in irb
$ (gdb) set args -e 'puts "hello world"'
$ (gdb) break main
$ (gdb) run
In this terminal, I attach cgdb
to the Ruby process I want to debug, and then
I set the arguments I want to feed into the ruby executable to see what happens
when puts "hello world"
is interpreted. If you can’t set breakpoints, use file
to
associate C source code with the ruby executable. Use step
in gdb to step into
functions and next
in gdb to skip over functions.