#!/usr/bin/env ruby require 'optparse' require 'stackprof' options = { :format => :text, :sort => false, :limit => 30 } parser = OptionParser.new(ARGV) do |o| o.banner = "Usage: stackprof [file.dump]+ [--text|--method=NAME|--callgrind|--graphviz]" o.on('--text', 'Text summary per method (default)'){ options[:format] = :text } o.on('--files', 'List of files'){ |f| options[:format] = :files } o.on('--limit [num]', Integer, 'Limit --text or --files output to N lines'){ |n| options[:limit] = n } o.on('--sort-total', "Sort --text or --files output on total samples\n\n"){ options[:sort] = true } o.on('--method [grep]', 'Zoom into specified method'){ |f| options[:format] = :method; options[:filter] = f } o.on('--file [grep]', 'Show annotated code for specified file'){ |f| options[:format] = :file; options[:filter] = f } o.on('--stackcollapse', 'stackcollapse.pl compatible output (use with flamegraph.pl)'){ options[:format] = :stackcollapse } o.on('--callgrind', 'Callgrind output (use with kcachegrind, gprof2dot)'){ options[:format] = :callgrind } o.on('--graphviz', "Graphviz output (use with dot)\n\n"){ options[:format] = :graphviz } o.on('--dump', 'Print marshaled profile dump (combine multiple profiles)'){ options[:format] = :dump } o.on('--debug', 'Pretty print raw profile data'){ options[:format] = :debug } end parser.parse! parser.abort(parser.help) if ARGV.empty? reports = [] while ARGV.size > 0 begin file = ARGV.pop reports << StackProf::Report.new(Marshal.load(IO.binread(file))) rescue TypeError => e STDERR.puts "** error parsing #{file}: #{e.inspect}" end end report = reports.inject(:+) case options[:format] when :text report.print_text(options[:sort], options[:limit]) when :debug report.print_debug when :dump report.print_dump when :callgrind report.print_callgrind when :graphviz report.print_graphviz when :stackcollapse report.print_stackcollapse when :method report.print_method(options[:filter]) when :file report.print_file(options[:filter]) when :files report.print_files(options[:sort], options[:limit]) else raise ArgumentError, "unknown format: #{options[:format]}" end