From: Hidetoshi NAGAI Date: 2006-12-21T17:25:16+09:00 Subject: Re: ruby-prof doesn't work with ruby/tk? From: "fkc_email-news @ yahoo dot com" Subject: ruby-prof doesn't work with ruby/tk? Date: Thu, 21 Dec 2006 10:15:09 +0900 Message-ID: <1166663473.028934.253930@f1g2000cwa.googlegroups.com> > 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 to $0. # -h, --help Show help message # --version Show version # @@ -90,6 +91,11 @@ end end + + opts.on('-s', '--set-program-name', 'Set 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("#"); - rb_raise(rb_eRuntimeError, "Unknown singleton class: %i", result); + rb_warn("Unknown singleton class: %i", result); } return result; -- Hidetoshi NAGAI (nagai@ai.kyutech.ac.jp)