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