tmm1 / gdb.rb

gdb hooks for MRI/REE (and some for YARV)
220 stars 18 forks source link

gdb7 hooks for MRI (c) 2009 Aman Gupta (tmm1)

=== Requirements

gdb.rb currently requires x86_64 linux, and MRI/REE 1.8.x or 1.9.2.

=== Usage

$ ps aux | grep deploy.rb 13074 0.0 0.7 90164 31720 ? R Sep23 2:21 /usr/bin/ruby /usr/bin/god -c deploy.rb

$ sudo gdb.rb 13074 GNU gdb (GDB) 7.0 Reading symbols from /usr/bin/ruby...done. Attaching to program: /usr/bin/ruby, process 13074 0x00007fa8b9cb3c93 in select () from /lib/libc.so.6

(gdb) ruby eval 1+2 2

(gdb) ruby eval Thread.list.count 17

(gdb) ruby threads list 0x1589000 main thread THREAD_STOPPED WAIT_JOIN(0x19ef400) 4417 bytes 0x19ef400 thread THREAD_STOPPED WAIT_TIME(57.10) 6267 bytes 0x19e3400 thread THREAD_STOPPED WAIT_FD(5) 10405 bytes 0x19e0000 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19e0400 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19e0800 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19e0c00 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19de000 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19de400 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19de800 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19dec00 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19dc000 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19dc400 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19dc800 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x19dcc00 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x2266800 thread THREAD_STOPPED WAIT_NONE 14237 bytes 0x1d63000 curr thread THREAD_RUNNABLE WAIT_NONE

(gdb) ruby threads 0x1589000 main thread THREAD_STOPPED WAIT_JOIN(0x19ef400) 4417 bytes node_call join in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:626 node_call start in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:633 node_call at_exit in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:666 node_fcall (unknown) in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/cli/run.rb:87

0x19ef400 thread THREAD_STOPPED WAIT_TIME(45.25) 6267 bytes node_fcall sleep in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:622 node_fcall start in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:621 node_fcall loop in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:621 node_call start in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:620 node_call initialize in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:620 node_call new in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:620 node_call start in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:633 node_call at_exit in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god.rb:666 node_fcall (unknown) in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/cli/run.rb:87

0x19e3400 thread THREAD_STOPPED WAIT_FD(5) 10405 bytes node_call accept in /usr/lib/ruby/1.8/drb/unix.rb:98 node_call accept in /usr/lib/ruby/1.8/drb/drb.rb:1581 node_vcall main_loop in /usr/lib/ruby/1.8/drb/drb.rb:1430 node_call run in /usr/lib/ruby/1.8/drb/drb.rb:1427 node_call start in /usr/lib/ruby/1.8/drb/drb.rb:1427 node_vcall run in /usr/lib/ruby/1.8/drb/drb.rb:1347 node_call initialize in /usr/lib/ruby/1.8/drb/drb.rb:1627

(gdb) ruby threads trace -- Tracing thread context switches. 0x19ef400 thread THREAD_RUNNABLE WAIT_NONE 6267 bytes 0x1d63000 thread THREAD_RUNNABLE WAIT_NONE 8623 bytes 0x19e3400 thread THREAD_RUNNABLE WAIT_NONE 10405 bytes 0x3001c00 thread THREAD_RUNNABLE WAIT_NONE 9507 bytes 0x19e3400 thread THREAD_RUNNABLE WAIT_NONE 9507 bytes 0x3001c00 thread THREAD_RUNNABLE WAIT_NONE 15059 bytes 0x1d63000 thread THREAD_RUNNABLE WAIT_NONE 8623 bytes 0x3001c00 thread THREAD_RUNNABLE WAIT_NONE 15059 bytes

(gdb) ruby trace 25 -- Tracing the next 25 ruby method calls. handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 watching_pid? in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:58 [] in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 default in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 watching_pid? in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:58 [] in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 default in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 watching_pid? in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:58 [] in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 default in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66 watching_pid? in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:58 [] in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 default in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:59 handle_events in /usr/lib/ruby/gems/1.8/gems/god-0.7.13/bin/../lib/god/event_handler.rb:66

(gdb) ruby objects

HEAPS            8
SLOTS      1686252
LIVE        893327 (52.98%)
FREE        792925 (47.02%)

bignum           2 (0.00%)
file            51 (0.01%)
float           77 (0.01%)
module         781 (0.09%)
varmap        1354 (0.15%)
scope         1641 (0.18%)
match         1676 (0.19%)
iclass        1744 (0.20%)
regexp        2255 (0.25%)
data          3539 (0.40%)
class         3680 (0.41%)
hash          6196 (0.69%)
object        8785 (0.98%)
array        13850 (1.55%)
string      105350 (11.79%)
node        742346 (83.10%)

(gdb) ruby objects classes 1 YAML::Syck::Resolver 1 YAML::Syck::Resolver 1 SystemStackError 1 Object 1 Object 1 NoMemoryError 1 fatal 1 Object 1 Gem::SourceIndex 1 Gem::GemPathSearcher 1 Gem::ConfigFile 1 God::Logger 1 God::SimpleLogger 1 God::CLI::Run 1 DRb::DRbServer::InvokeMethod 1 DRb::DRbServer 1 DRb::DRbIdConv 1 God::Registry 1 OptionParser::Switch::OptionalArgument 1 OptionParser 1 God::Socket 1 God::Contacts::Email 2 Date::Infinity 2 DRb::DRbMessage 2 DRb::DRbBadScheme 2 DRb::DRbUNIXSocket 3 OptionParser::List 6 IOError 6 Errno::ESRCH 6 OptionParser::Switch::RequiredArgument 6 Net::InternetMessageIO 7 God::System::SlashProcPoller 7 God::System::Process 7 God::DriverOperation 7 Net::SMTP 8 StandardError 10 OptionParser::Switch::NoArgument 13 God::Conditions::Flapping 13 God::Conditions::ProcessExits 13 God::Behaviors::CleanPidFile 13 God::Process 13 God::Watch 13 God::Driver 13 God::DriverEventQueue 19 God::DriverEvent 38 Process::Status 39 God::Conditions::ProcessRunning 50 Range 63 Gem::Specification 65 God::Metric 81 Gem::Dependency 174 Gem::Version::Part 209 Gem::Requirement 219 Gem::Version

(gdb) ruby objects strings 70 u'bin' 73 u' INFO' 74 u'--main' 74 u'I' 75 u'..' 78 u'ruby' 80 u'::' 92 u'1.3.2' 100 u'README.rdoc' 102 u' ' 108 u'Rakefile' 110 u'README' 114 u'\r\n' 127 u'>=' 140 u'lib' 158 u'0' 294 u'\n' 619 u''

  30503 unique strings
3187435 bytes

(gdb) ruby objects nodes 8156 NODE_EVSTR 8966 NODE_COLON2 10020 NODE_DVAR 11493 NODE_AND 13157 NODE_FCALL 14493 NODE_VCALL 15148 NODE_ARGS 15180 NODE_CONST 15445 NODE_SCOPE 16582 NODE_IF 21594 NODE_LASGN 22084 NODE_METHOD 26633 NODE_STR 37819 NODE_LIT 64325 NODE_LVAR 64470 NODE_NEWLINE 69436 NODE_BLOCK 85825 NODE_CALL 126739 NODE_ARRAY

=== TODO

ruby where for the current stack trace ruby print to inspect ruby variables ruby breakpoint to breakpoint on ruby methods ruby irb for a simple interactive shell

=== Credits

Tom Tromey for his work on gdb python support (gdb-eval.patch, gdb-breakpoints.patch) and help tracking down some memory leaks (gdb-leak.patch)

Joe Damato for writing parts of ruby-gdb.py and various gdb hacks to make gdb.rb possible.

=== License

Available under the Ruby License.