#!/custom/ree/bin/ruby # USAGE: # # echo "|/path/to/core_helper.rb %p %s %u %g" > /proc/sys/kernel/core_pattern # require 'etc' require 'net/smtp' CORE_DIR = "/cores" TO_EMAIL = "dev@blah.com" FROM_EMAIL = "core_watcher@blah.com" MAIL_SERVER = "blah" class CoreHelper def self.start! time = Time.now.strftime("%Y-%m-%d-%H:%M") corefile = "#{CORE_DIR}/core-#{time}.core" cmdline = File.read("/proc/#{ARGV[0]}/cmdline") f = File.new("#{CORE_DIR}/core-#{time}-metadata", "w") f.puts "PID: #{ARGV[0]}" f.puts "Signal: #{ARGV[1]}" f.puts "UID: #{Etc.getpwuid(ARGV[2].to_i)[:name]}/#{ARGV[2]}, GID: #{Etc.getgrgid(ARGV[3].to_i)[:name]}/#{ARGV[3]}" f.puts "Command line: #{cmdline}" f.puts f.puts f.flush core = File.new(corefile, "w") begin while (chunk = STDIN.read) core.write chunk break if chunk == nil || chunk.length == 0 end rescue EOFError core.close end core.close r,w = IO.pipe child = fork{ $stdin.reopen(r); $stdout.reopen(f); $stderr.reopen(f); exec "/usr/bin/gdb -q -c #{corefile}" } w.puts "set height 0" w.puts "backtrace" w.puts "info registers" w.puts "x/5i $rip" w.puts "quit" Process.wait msg = <