Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- require 'set'
- require 'json'
- if ARGV.length != 2
- puts "Usage: detect_leaks [FIRST.json] [SECOND.json]"
- exit 1
- end
- first_addrs = Set.new
- second_addrs = Set.new
- # Get a list of memory addresses from the first dump
- File.open(ARGV[0], "r").each_line do |line|
- parsed = JSON.parse(line)
- first_addrs << parsed["address"] if parsed && parsed["address"]
- end
- # Get a list of memory addresses from the last dump
- File.open(ARGV[1], "r").each_line do |line|
- parsed = JSON.parse(line)
- second_addrs << parsed["address"] if parsed && parsed["address"]
- end
- diff = []
- # Get a list of all items present in both the second and
- # third dumps but not in the first.
- File.open(ARGV[1], "r").each_line do |line|
- parsed = JSON.parse(line)
- if parsed && parsed["address"]
- diff << parsed unless first_addrs.include?(parsed["address"])
- end
- end
- # Group items
- diff.group_by do |x|
- [x["type"], x["file"], x["line"]]
- end.map do |x,y|
- # Collect memory size
- [x, y.count, y.inject(0){|sum,i| sum + (i['bytesize'] || 0) }, y.inject(0){|sum,i| sum + (i['memsize'] || 0) }]
- end.sort do |a,b|
- b[1] <=> a[1]
- end.each do |x,y,bytesize,memsize|
- # Output information about each potential leak
- puts "Leaked #{y} #{x[0]} objects of size #{bytesize}/#{memsize} at: #{x[1]}:#{x[2]}"
- end
- # Also output total memory usage, because why not?
- memsize = diff.inject(0){|sum,i| sum + (i['memsize'] || 0) }
- bytesize = diff.inject(0){|sum,i| sum + (i['bytesize'] || 0) }
- puts "\n\nTotal Diff: #{diff.count}"
- puts "\n\nTotal Size: #{bytesize}/#{memsize}"
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement