Created
July 19, 2010 07:27
-
-
Save headius/481102 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'java' | |
module JRuby | |
class Debugger | |
VMM = com.sun.jdi.Bootstrap.virtual_machine_manager | |
attr_accessor :vm | |
def initialize(options = {}) | |
connectors = VMM.attaching_connectors | |
if options[:port] | |
connector = connectors.find {|ac| ac.name =~ /Socket/} | |
elsif options[:pid] | |
connector = connectors.find {|ac| ac.name =~ /Process/} | |
end | |
args = connector.default_arguments | |
for k, v in options | |
args[k.to_s].value = v.to_s | |
end | |
@vm = connector.attach(args) | |
end | |
# Generate a histogram of all classes in the system | |
def histogram | |
classes = @vm.all_classes | |
counts = @vm.instance_counts(classes) | |
classes.zip(counts) | |
end | |
end | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'jruby_debugger' | |
# connect to the VM | |
debugr = JRuby::Debugger.new(:hostname => 'localhost', :port => 12345) | |
histo = debugr.histogram | |
# sort by count | |
histo.sort! {|a,b| b[1] <=> a[1]} | |
# filter to only user-created Ruby classes with >0 instances | |
histo.each do |cls,num| | |
next if num == 0 || cls.name[0..4] != 'ruby.' || cls.name[5..7] == 'jit' | |
puts "#{num} instances of #{cls.name[5..-1].gsub('.', '::')}" | |
end |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
require 'jruby_debugger' | |
# connect to the VM | |
debugr = JRuby::Debugger.new(:hostname => 'localhost', :port => 12345) | |
tti_class = debugr.vm.classes_by_name('ruby.TZInfo.TimezoneTransitionInfo')[0] | |
tti_obj = tti_class.instances(1)[0] | |
# get the varTable array from the object | |
var_table_field = tti_class.field_by_name('varTable') | |
tti_vars = tti_obj.get_value(var_table_field) | |
# get the metaclass object and class reference | |
metaclass_field = tti_class.field_by_name('metaClass') | |
tti_class_obj = tti_obj.get_value(metaclass_field) | |
tti_class_class = tti_class_obj.reference_type | |
# get the variable names from the metaclass object | |
var_names_field = tti_class_class.field_by_name('variableNames') | |
var_names = tti_class_obj.get_value(var_names_field) | |
# splice the names and values together | |
table = var_names.values.zip(tti_vars.values) | |
puts table |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment