New albums drop on Tuesdays, why not drop some nifty knowledge as well?
Today, I had the pleasure of attending an Engine Yard webinar, Debugging
Ruby Systems. In this webinar, the always sharp Aman Gupta (twitter, github), reviewed his
favorite tools for debugging ruby and rails applications.
The webinar recording isn’t yet up and even though the slides will eventually be posted,
I figured it would be worthwhile to post my notes so here they are. For my
next post, I’ll cover which tools helped me diagnose and resolve an
outstanding issue in one of our current applications. Stay tuned!
All credit for good goes to Aman. Any errors are mine. Most of these tools are linux specific. Enjoy!
h4. lsof – show open files
lsof -nPp <pid>
summary mode, run it for a while and then hit ^C
strace -cp <pid></pid>
system call and arguments as they are happening
strace -ttTp <pid> -o <file></file></pid>
ruby 1.8 uses signals to schedule its green threads. process receives a SIGVTALRM signal
in summary mode, you see a lot of calls sigprocmask (ruby bug, shows up in
linux distribution ruby because compiled w/pthread as it is spawning thread to do signaling)
tcpdump -i eth0 -s <len> -nqA <expr>
dumps to file, and then open file in wireshark for further analysis
tcpdump -w <file></file>
download and compile, setup, profile and report
pprof ruby ruby.prof [--text|--gif] gem install perftools.rb
only interested in ruby c calls
real time (wall time) vs. CPU time
perftools does a good job helping you understand a code base as you can see
the function call graph
also has object allocation profile
ltrace -cp <pid> ltrace -ttTp <pid> -o <file>
traces library calls as opposed to strace does system calls.
joe domato - new maintainer of ltrace
no good ltrace on os x. no good strace on mac os x. dtrace works on mac os x
but doesn’t replicate all the functionality of strace and ltrace
gdb <executable> gdb attach <pid>
gdb.rb – gdb with MRI hooks
gem install gdb.rb
gem install memprof
like bleak_house, but for a given block of code
use memprof::Middleware in your webapps to run track per request
dump out every single live object as json
one per line to specified file
couple hundred mb file
custom ruby scripts
gem install rack-perftools_profiler
middleware that adds urls to app that, if special params are included,
intercepts a request and returns profile info!