From: "fkc_email-news @ yahoo dot com" <
[email protected]>
Subject: ruby-prof doesn't work with ruby/tk?
Date: Thu, 21 Dec 2006 10:15:09 +0900
Message-ID: said:
I've tried on several platforms and get the follow error with any tk
code.
[Forrest@Mori ~/<1>masc_log_viewer/lib]$ ruby-prof tkcombobox.rb
/usr/lib/ruby/gems/1.8/gems/ruby-prof-0.4.1/bin/ruby-prof:128:in
`stop': Unknown singleton class: 2145471700 (RuntimeError)
from
/usr/lib/ruby/gems/1.8/gems/ruby-prof-0.4.1/bin/ruby-prof:128 (snip)
Is this a known problem? Any alternatives for profiling ruby/tk apps
that are quicker than the built in profiler?
Please try the following patch.
And run "ruby-prof -s tkcombobox.rb".
^^
diff -urN ruby-prof-0.4.1.orig/bin/ruby-prof ruby-prof-0.4.1.modify/bin/ruby-prof
--- ruby-prof-0.4.1.orig/bin/ruby-prof 2006-06-23 06:36:49.000000000 +0900
+++ ruby-prof-0.4.1.modify/bin/ruby-prof 2006-12-21 16:22:06.000000000 +0900
@@ -19,6 +19,7 @@
# wall - Use wall time.
# cpu - Use the CPU clock counter
# (only supported on Pentium and PowerPCs).
+# -s, --set-program-name Set <script.rb> to $0.
# -h, --help Show help message
# --version Show version
#
@@ -90,6 +91,11 @@
end
end
+
+ opts.on('-s', '--set-program-name', 'Set <script.rb> to $0.') do |mode|
+ options.set_progname = mode
+ end
+
opts.on_tail("-h", "--help", "Show help message") do
puts opts
exit
@@ -118,6 +124,56 @@
exit(-1)
end
+# replace $0 and $PROGRAM_NAME
+if options.set_progname
+ progname_obj = Object.new
+ progname_obj.instance_variable_set
@progname, $0)
+
+ class << progname_obj
+ def __set_progname__(name)
+ @progname = name.to_s
+ end
+
+ def to_str
+ @progname
+ end
+ alias to_s to_str
+ alias inspect to_str
+
+ def ===(other)
+ other === self.to_str
+ end
+
+ def ==(other)
+ other == self.to_str
+ end
+
+ def equal?(other)
+ other.equal?(self.to_str)
+ end
+
+ def eql?(other)
+ other.eql?(self.to_str)
+ end
+
+ def method_missing(id, *args)
+ self.to_str.__send__(id, *args)
+ end
+ end
+
+ $program_name = progname_obj
+
+ alias $REAL_PROGRAM_NAME $0
+ alias $PROGRAM_NAME $program_name
+ alias $0 $program_name
+
+ trace_var
$program_name){|val|
+ unless progname_obj.object_id == val.object_id
+ progname_obj.__set_progname__(val)
+ $program_name = progname_obj
+ end
+ }
+end
# Install at_exit handler. It is important that we do this
# before loading the scripts so our at_exit handler run
@@ -146,6 +202,7 @@
# Get the script we will execute
script = ARGV.shift
+$0 = script if options.set_progname
# Start profiling
RubyProf.start
diff -urN ruby-prof-0.4.1.orig/ext/ruby_prof.c ruby-prof-0.4.1.modify/ext/ruby_prof.c
--- ruby-prof-0.4.1.orig/ext/ruby_prof.c 2006-06-23 06:36:49.000000000 +0900
+++ ruby-prof-0.4.1.modify/ext/ruby_prof.c 2006-12-21 16:20:58.000000000 +0900
@@ -304,7 +304,7 @@
result = rb_str_new2("<Unknown:");
rb_str_append(result, rb_inspect(klass));
rb_str_cat2(result, ">#");
- rb_raise(rb_eRuntimeError, "Unknown singleton class: %i", result);
+ rb_warn("Unknown singleton class: %i", result);
}
return result;