#!/usr/bin/env ruby -w # argv: logfile # Like file-offenders.rb, but collects stack frames instead of filenames. filename = ARGV.shift onlyTops = ARGV.shift frames = {} open(filename, 'r') do |file| file.each("\n\n") do |para| paraFrames = para.split("\n").inject([]) do |memo, line| next memo if onlyTops && /^0/ !~ line match = /^[0-9]+ (.+)$/.match(line) memo << match[1] if match memo end paraFrames.uniq.each do |frame| frames[frame] ||= 0 frames[frame] += 1 end end end frames = frames.to_a.sort_by { |frame, cnt| -cnt } maxCntLen = frames[0][1].to_s.size frames.each { |frame, cnt| puts "%*d %s" % [maxCntLen, cnt, frame] }