public
Created — forked from tmm1/debug.rb

  • Download Gist
debug.rb
Ruby
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
# collect information about a running process
# ruby debug.rb <pid>
 
begin
raise ArgumentError unless pid = ARGV[0]
pid = pid.to_i
Process.kill(0,pid)
rescue TypeError, ArgumentError
raise 'pid required'
rescue Errno::ESRCH
raise 'invalid pid'
rescue Errno::EPERM
raise 'could not signal process (run as root)'
end
 
require 'fileutils'
dir = FileUtils.mkdir_p "/tmp/debug-#{pid}"
puts "Debugging process #{pid}, results in #{dir}."
 
5.times do |i|
out = File.open("#{dir}/gdb-backtrace-#{i}.txt",'w')
r,w = IO.pipe
child = fork{ $stdin.reopen(r); $stdout.reopen(out); $stderr.reopen(out); exec "gdb /proc/#{pid}/exe" }
w.puts "attach #{pid}"
w.puts "backtrace"
w.puts "detach"
w.puts "quit"
Process.wait
out.close
 
sleep 1
end
 
out = File.open("#{dir}/strace-summary.txt",'w')
child = fork{ $stdout.reopen(out); $stderr.reopen(out); exec "strace -cp #{pid}" }
sleep 30
Process.kill 'HUP', child
Process.wait
out.close
 
out = File.open("#{dir}/strace-log.txt",'w')
child = fork{ $stdout.reopen(out); $stderr.reopen(out); exec "strace -ttTp #{pid}" }
sleep 30
Process.kill 'HUP', child
Process.wait
out.close

Please sign in to comment on this gist.

Something went wrong with that request. Please try again.