Skip to content

Instantly share code, notes, and snippets.

@tmm1
Created October 14, 2009 06:48
Show Gist options
  • Star 6 You must be signed in to star a gist
  • Fork 6 You must be signed in to fork a gist
  • Save tmm1/209839 to your computer and use it in GitHub Desktop.
Save tmm1/209839 to your computer and use it in GitHub Desktop.
debug a process using strace/gdb
# 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 "set height 0"
w.puts "backtrace"
w.puts "detach"
w.puts "quit"
Process.wait
out.close
sleep 1
end
out = File.open("#{dir}/lsof.txt",'w')
child = fork{ $stdout.reopen(out); $stderr.reopen(out); exec "lsof -nPp #{pid}" }
Process.wait
out.close
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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment