Hi guys,
I'm interested in tracing method definition in core and stdlibs.
However, I'm not sure how to hook in the process at such an early
stage.
For example, if I put the following code in trace.rb:
[Class, Module].each do |n|
n.class_eval do |clz|
def method_added(x)
puts "Method==#{x}"
end
end
end
And then call
$ ruby -rtrace.rb -e 'puts "test"'
I only see two "Method==" outputted...both "Method==method_added", and
both obviously in response to this code itself.
Is there a way to hook in earlier?
Thanks,
John
Probably not as many methods of the standard library are define in C code and I doubt that will trigger a method_added.
Btw, what do you need that for?
Cheers
robert
···
On 20.03.2009 13:56, John Wells wrote:
I'm interested in tracing method definition in core and stdlibs.
However, I'm not sure how to hook in the process at such an early
stage.
For example, if I put the following code in trace.rb:
[Class, Module].each do |n|
n.class_eval do |clz|
def method_added(x)
puts "Method==#{x}"
end
end
end
And then call
$ ruby -rtrace.rb -e 'puts "test"'
I only see two "Method==" outputted...both "Method==method_added", and
both obviously in response to this code itself.
Is there a way to hook in earlier?
Yes, but I'd expect to see a good bit that were ruby too, correct?
I'd like to create a utility method that would allow me to easily see
everywhere a method (file name, line number) is defined...I have it
working for scripts I write myself, but only going forward from that
script scope...not back through the libs. So I'd like to hook in
early...before any ruby files are loaded at all.
···
On Fri, Mar 20, 2009 at 12:22 PM, Robert Klemme <shortcutter@googlemail.com> wrote:
On 20.03.2009 13:56, John Wells wrote:
I'm interested in tracing method definition in core and stdlibs.
However, I'm not sure how to hook in the process at such an early
stage.
For example, if I put the following code in trace.rb:
[Class, Module].each do |n|
n.class_eval do |clz|
def method_added(x)
puts "Method==#{x}"
end
end
end
And then call
$ ruby -rtrace.rb -e 'puts "test"'
I only see two "Method==" outputted...both "Method==method_added", and
both obviously in response to this code itself.
Is there a way to hook in earlier?
Probably not as many methods of the standard library are define in C code
and I doubt that will trigger a method_added.
Btw, what do you need that for?
Is there any way to accomplish this in 1.8.x?
Thanks,
John
···
On Fri, Mar 20, 2009 at 12:42 PM, John Wells <lists@sourceillustrated.com> wrote:
Yes, but I'd expect to see a good bit that were ruby too, correct?
I'd like to create a utility method that would allow me to easily see
everywhere a method (file name, line number) is defined...I have it
working for scripts I write myself, but only going forward from that
script scope...not back through the libs. So I'd like to hook in
early...before any ruby files are loaded at all.
Lack of responses to me indicates that you probably need to hack Ruby's C core to achieve what you want. If you just want to see method definitions you can as well get Ruby sources and search through them.
Kind regards
robert
···
On 20.03.2009 19:45, John Wells wrote:
On Fri, Mar 20, 2009 at 12:42 PM, John Wells > <lists@sourceillustrated.com> wrote:
Yes, but I'd expect to see a good bit that were ruby too, correct?
I'd like to create a utility method that would allow me to easily see
everywhere a method (file name, line number) is defined...I have it
working for scripts I write myself, but only going forward from that
script scope...not back through the libs. So I'd like to hook in
early...before any ruby files are loaded at all.
Is there any way to accomplish this in 1.8.x?
Thanks Robert. I wasn't thinking properly about it. I believe you were
correct in saying most everything loaded before doing a simple puts is
just C code...the more I thought about it (and after running strace to
verify), it seems that no external ruby libs are loaded up by the
interpreter assuming that your code doesn't do any specific requires.
So, the code I showed gave no results correctly...but if you change it
to:
$ ruby -rtrace.rb -e 'require "net/http"'
You get the expected results. So, in lieu of having rubinius, I think
that's the best you can expect. Everything else you'd have to dive
into the C for. And honestly, I don't really care about the C...I'm
more interested in being able to debug libraries and gems that are
more promiscuous than they should be.
I appreciate your help and guidance.
John
···
On Sat, Mar 21, 2009 at 6:17 AM, Robert Klemme <shortcutter@googlemail.com> wrote:
Lack of responses to me indicates that you probably need to hack Ruby's C
core to achieve what you want. If you just want to see method definitions
you can as well get Ruby sources and search through them.