Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # collect information about a running process
- # ruby debug.rb <pid>
- begin
- raise ArgumentError unless pid = ARGV[0]
- pid = pid.to_i
- raise ArgumentError unless pid > 0
- 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}."
- File.open("#{dir}/proc-status.txt",'w'){ |f| f.write File.read("/proc/#{pid}/status") }
- 10.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 1024"
- 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 5
- 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 5
- Process.kill 'HUP', child
- Process.wait
- out.close
Add Comment
Please, Sign In to add comment