class MemDump::CLI
Public Instance Methods
cleanup_refs(dump, output)
click to toggle source
# File lib/memdump/cli.rb, line 88 def cleanup_refs(dump, output) require 'memdump/cleanup_references' STDOUT.sync = true dump = MemDump::JSONDump.new(Pathname.new(dump)) cleaned = MemDump.cleanup_references(dump) Pathname.new(output).open('w') do |io| cleaned.each do |r| io.puts JSON.dump(r) end end end
diff(source, target, output)
click to toggle source
# File lib/memdump/cli.rb, line 19 def diff(source, target, output) from = MemDump::JSONDump.load(source) to = MemDump::JSONDump.load(target) diff = from.diff(to) STDOUT.sync puts "#{diff.size} nodes are in target but not in source" diff = to.roots_of(diff) puts "#{diff.size} nodes in final dump" diff.save(output) end
dump(pid, file)
click to toggle source
# File lib/memdump/cli.rb, line 13 def dump(pid, file) file = File.expand_path(file) system('rbtrace', '-p', pid.to_s, '-e', "require \"objspace\"; File.open(\"#{file}\", 'w') { |io| ObjectSpace.dump_all(output: io) }") end
enable_allocation_trace(pid)
click to toggle source
# File lib/memdump/cli.rb, line 8 def enable_allocation_trace(pid) system('rbtrace', '-p', pid.to_s, '-e', "require \"objspace\"; ObjectSpace.trace_object_allocations_start") end
gml(dump_path, gml_path = nil)
click to toggle source
# File lib/memdump/cli.rb, line 31 def gml(dump_path, gml_path = nil) require 'memdump/convert_to_gml' STDOUT.sync = true dump_path = Pathname.new(dump_path) if gml_path gml_path = Pathname.new(gml_path) else gml_path = dump_path.sub_ext('.gml') end dump = MemDump::JSONDump.new(dump_path) gml_path.open('w') do |io| MemDump.convert_to_gml(dump, io) end end
interactive(dump)
click to toggle source
# File lib/memdump/cli.rb, line 141 def interactive(dump) require 'memdump' require 'pry' dump = MemDump::JSONDump.new(Pathname.new(dump)) if options[:load] dump = dump.load end dump.pry end
out_degree(dump)
click to toggle source
# File lib/memdump/cli.rb, line 128 def out_degree(dump) dump = MemDump::JSONDump.new(Pathname.new(dump)) min = options[:min] || 0 sorted = dump.each_record.sort_by { |r| (r['references'] || Array.new).size } sorted.each do |r| size = (r['references'] || Array.new).size break if size > min puts "#{size} #{r}" end end
remove_node(dump, node_id)
click to toggle source
# File lib/memdump/cli.rb, line 102 def remove_node(dump, node_id) require 'memdump/remove_node' STDOUT.sync = true dump = MemDump::JSONDump.new(Pathname.new(dump)) cleaned = MemDump.remove_node(dump, node_id) cleaned.each do |r| STDOUT.puts JSON.dump(r) end end
replace_class(dump_path, output_path = nil)
click to toggle source
# File lib/memdump/cli.rb, line 73 def replace_class(dump_path, output_path = nil) require 'memdump/replace_class_address_by_name' STDOUT.sync = true dump_path = Pathname.new(dump_path) output_path = if output_path then Pathname.new(output_path) else dump_path end dump = MemDump::JSONDump.load(dump_path) dump = dump.replace_class_id_by_class_name(add_reference_to_class: options[:add_ref]) dump.save(output_path) end
root_of(dump, address)
click to toggle source
# File lib/memdump/cli.rb, line 61 def root_of(dump, address) require 'memdump/root_of' STDOUT.sync = true dump = MemDump::JSONDump.new(Pathname.new(dump)) MemDump.root_of(dump, address).each do |r| puts JSON.dump(r) end end
stats(dump)
click to toggle source
# File lib/memdump/cli.rb, line 114 def stats(dump) require 'pp' require 'memdump/stats' dump = MemDump::JSONDump.load(dump) unknown, by_type = dump.stats puts "#{unknown} objects without a known type" by_type.sort_by { |n, v| v }.reverse.each do |n, v| puts "#{n}: #{v}" end end
subgraph_of(dump, address)
click to toggle source
# File lib/memdump/cli.rb, line 50 def subgraph_of(dump, address) require 'memdump/subgraph_of' STDOUT.sync = true dump = MemDump::JSONDump.new(Pathname.new(dump)) MemDump.subgraph_of(dump, address, max_depth: options[:max_depth]).each do |r| puts JSON.dump(r) end end