mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
* vm_trace.c: Documentation for TracePoint API
[ruby-core:47243] [Feature #6895] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@38045 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
020cc0ad5c
commit
f2fee84466
2 changed files with 161 additions and 1 deletions
|
@ -1,3 +1,8 @@
|
||||||
|
Fri Nov 30 18:24:00 2012 Zachary Scott <zachary@zacharyscott.net>
|
||||||
|
|
||||||
|
* vm_trace.c: Documentation for TracePoint API
|
||||||
|
[ruby-core:47243] [Feature #6895]
|
||||||
|
|
||||||
Fri Nov 30 17:43:50 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
Fri Nov 30 17:43:50 2012 Nobuyoshi Nakada <nobu@ruby-lang.org>
|
||||||
|
|
||||||
* string.c (rb_str_cmp_m): try to compare with to_str result if
|
* string.c (rb_str_cmp_m): try to compare with to_str result if
|
||||||
|
|
157
vm_trace.c
157
vm_trace.c
|
@ -785,6 +785,11 @@ rb_tracearg_raised_exception(rb_trace_arg_t *trace_arg)
|
||||||
return trace_arg->data;
|
return trace_arg->data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Type of event
|
||||||
|
*
|
||||||
|
* See TracePoint.new for events
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_event(VALUE tpval)
|
tracepoint_attr_event(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -793,6 +798,9 @@ tracepoint_attr_event(VALUE tpval)
|
||||||
return rb_tracearg_event(tp->trace_arg);
|
return rb_tracearg_event(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Line number of the event
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_lineno(VALUE tpval)
|
tracepoint_attr_lineno(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -801,6 +809,9 @@ tracepoint_attr_lineno(VALUE tpval)
|
||||||
return rb_tracearg_lineno(tp->trace_arg);
|
return rb_tracearg_lineno(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Path of the file being run
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_path(VALUE tpval)
|
tracepoint_attr_path(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -809,6 +820,9 @@ tracepoint_attr_path(VALUE tpval)
|
||||||
return rb_tracearg_path(tp->trace_arg);
|
return rb_tracearg_path(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the name of the method being called
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_method_id(VALUE tpval)
|
tracepoint_attr_method_id(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -817,6 +831,9 @@ tracepoint_attr_method_id(VALUE tpval)
|
||||||
return rb_tracearg_method_id(tp->trace_arg);
|
return rb_tracearg_method_id(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return class or id from +:class+ event
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_defined_class(VALUE tpval)
|
tracepoint_attr_defined_class(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -825,6 +842,9 @@ tracepoint_attr_defined_class(VALUE tpval)
|
||||||
return rb_tracearg_defined_class(tp->trace_arg);
|
return rb_tracearg_defined_class(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the generated binding object from event
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_binding(VALUE tpval)
|
tracepoint_attr_binding(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -833,6 +853,12 @@ tracepoint_attr_binding(VALUE tpval)
|
||||||
return rb_tracearg_binding(tp->trace_arg);
|
return rb_tracearg_binding(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return the trace object during event
|
||||||
|
*
|
||||||
|
* Same as TracePoint#binding:
|
||||||
|
* trace.binding.eval('self')
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_self(VALUE tpval)
|
tracepoint_attr_self(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -841,6 +867,9 @@ tracepoint_attr_self(VALUE tpval)
|
||||||
return rb_tracearg_self(tp->trace_arg);
|
return rb_tracearg_self(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Return value from +:return+ and +c_return+ event
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_return_value(VALUE tpval)
|
tracepoint_attr_return_value(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -849,6 +878,9 @@ tracepoint_attr_return_value(VALUE tpval)
|
||||||
return rb_tracearg_return_value(tp->trace_arg);
|
return rb_tracearg_return_value(tp->trace_arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Value from exception raised on the +:raise+ event
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_attr_raised_exception(VALUE tpval)
|
tracepoint_attr_raised_exception(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -916,6 +948,21 @@ rb_tracepoint_disable(VALUE tpval)
|
||||||
return Qundef;
|
return Qundef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* trace.enable -> trace
|
||||||
|
* trace.enable { |obj| block } -> obj
|
||||||
|
*
|
||||||
|
* Activates the trace
|
||||||
|
*
|
||||||
|
* Will raise a RuntimeError if the trace is already activated
|
||||||
|
*
|
||||||
|
* trace.enabled? #=> false
|
||||||
|
* trace.enable #=> #<TracePoint:0x007fa3fad4aaa8>
|
||||||
|
* trace.enabled? #=> true
|
||||||
|
* trace.enable #=> RuntimeError
|
||||||
|
*
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_enable_m(VALUE tpval)
|
tracepoint_enable_m(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -934,6 +981,21 @@ tracepoint_enable_m(VALUE tpval)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* trace.disable -> trace
|
||||||
|
* trace.disable { |obj| block } -> obj
|
||||||
|
*
|
||||||
|
* Deactivates the trace
|
||||||
|
*
|
||||||
|
* Will raise a RuntimeError if the trace is already deactivated
|
||||||
|
*
|
||||||
|
* trace.enabled? #=> true
|
||||||
|
* trace.disable #=> #<TracePoint:0x007fa3fad4aaa8>
|
||||||
|
* trace.enabled? #=> false
|
||||||
|
* trace.disable #=> RuntimeError
|
||||||
|
*
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_disable_m(VALUE tpval)
|
tracepoint_disable_m(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -952,6 +1014,12 @@ tracepoint_disable_m(VALUE tpval)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* trace.enabled? -> true or false
|
||||||
|
*
|
||||||
|
* The current status of the trace
|
||||||
|
*/
|
||||||
VALUE
|
VALUE
|
||||||
rb_tracepoint_enabled_p(VALUE tpval)
|
rb_tracepoint_enabled_p(VALUE tpval)
|
||||||
{
|
{
|
||||||
|
@ -985,6 +1053,56 @@ rb_tracepoint_new(VALUE target_thread, rb_event_flag_t events, void (*func)(VALU
|
||||||
return tracepoint_new(rb_cTracePoint, target_th, events, func, data, Qundef);
|
return tracepoint_new(rb_cTracePoint, target_th, events, func, data, Qundef);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* call-seq:
|
||||||
|
* TracePoint.new(*events) { |obj| block } -> obj
|
||||||
|
*
|
||||||
|
* Returns a new TracePoint object, not enabled by default.
|
||||||
|
*
|
||||||
|
* Next, in order to activate the trace, you must use TracePoint.enable
|
||||||
|
*
|
||||||
|
* trace = TracePoint.new(:call) do |tp|
|
||||||
|
* p [tp.lineno, tp.defined_class, tp.method_id, tp.event]
|
||||||
|
* end
|
||||||
|
* #=> #<TracePoint:0x007f17372cdb20>
|
||||||
|
*
|
||||||
|
* trace.enable
|
||||||
|
* #=> #<TracePoint:0x007f17372cdb20>
|
||||||
|
*
|
||||||
|
* puts "Hello, TracePoint!"
|
||||||
|
* # ...
|
||||||
|
* # [48, IRB::Notifier::AbstractNotifier, :printf, :call]
|
||||||
|
* # ...
|
||||||
|
*
|
||||||
|
* When you want to deactivate the trace, you must use TracePoint.disable
|
||||||
|
*
|
||||||
|
* trace.disable
|
||||||
|
*
|
||||||
|
* To filter what is traced, you can pass any of the following as +events+:
|
||||||
|
*
|
||||||
|
* +:line+:: execute code on a new line
|
||||||
|
* +:class+:: start a class or module definition
|
||||||
|
* +:end+:: finish a class or module definition
|
||||||
|
* +:call+:: call a Ruby method
|
||||||
|
* +:return+:: return from a Ruby method
|
||||||
|
* +:c_call+:: call a C-language routine
|
||||||
|
* +:c_return+:: return from a C-language routine
|
||||||
|
* +:raise+:: raise an exception
|
||||||
|
* +:b_call+:: event hook at block entry
|
||||||
|
* +:b_return+:: event hook at block ending
|
||||||
|
* +:thread_begin+:: event hook at thread beginning
|
||||||
|
* +:thread_end+:: event hook at thread ending
|
||||||
|
*
|
||||||
|
* A block must be given, otherwise a ThreadError is raised.
|
||||||
|
*
|
||||||
|
* If the trace method isn't included in the given events filter, a
|
||||||
|
* RuntimeError is raised.
|
||||||
|
*
|
||||||
|
* TracePoint.trace(:line) do |tp|
|
||||||
|
* p tp.raised_exception
|
||||||
|
* end
|
||||||
|
* #=> RuntimeError: 'raised_exception' not supported by this event
|
||||||
|
*/
|
||||||
static VALUE
|
static VALUE
|
||||||
tracepoint_new_s(int argc, VALUE *argv, VALUE self)
|
tracepoint_new_s(int argc, VALUE *argv, VALUE self)
|
||||||
{
|
{
|
||||||
|
@ -1024,11 +1142,48 @@ Init_vm_trace(void)
|
||||||
rb_define_method(rb_cThread, "set_trace_func", thread_set_trace_func_m, 1);
|
rb_define_method(rb_cThread, "set_trace_func", thread_set_trace_func_m, 1);
|
||||||
rb_define_method(rb_cThread, "add_trace_func", thread_add_trace_func_m, 1);
|
rb_define_method(rb_cThread, "add_trace_func", thread_add_trace_func_m, 1);
|
||||||
|
|
||||||
/* TracePoint */
|
/*
|
||||||
|
* Document-class: TracePoint
|
||||||
|
*
|
||||||
|
* A class that provides the functionality of Kernel#set_trace_func in a
|
||||||
|
* nice Object-Oriented API.
|
||||||
|
*
|
||||||
|
* = Example
|
||||||
|
*
|
||||||
|
* We can use TracePoint to gather information specifically for exceptions:
|
||||||
|
*
|
||||||
|
* trace = TracePoint.new(:raise) do |tp|
|
||||||
|
* p [tp.lineno, tp.event, tp.raised_exception]
|
||||||
|
* end
|
||||||
|
* #=> #<TracePoint:0x007f786a452448>
|
||||||
|
*
|
||||||
|
* trace.enable
|
||||||
|
* #=> #<TracePoint:0x007f786a452448>
|
||||||
|
*
|
||||||
|
* 0 / 0
|
||||||
|
* #=> [5, :raise, #<ZeroDivisionError: divided by 0>]
|
||||||
|
*
|
||||||
|
* See TracePoint.new for possible events.
|
||||||
|
*
|
||||||
|
*/
|
||||||
rb_cTracePoint = rb_define_class("TracePoint", rb_cObject);
|
rb_cTracePoint = rb_define_class("TracePoint", rb_cObject);
|
||||||
rb_undef_alloc_func(rb_cTracePoint);
|
rb_undef_alloc_func(rb_cTracePoint);
|
||||||
rb_undef_method(CLASS_OF(rb_cTracePoint), "new");
|
rb_undef_method(CLASS_OF(rb_cTracePoint), "new");
|
||||||
rb_define_singleton_method(rb_cTracePoint, "new", tracepoint_new_s, -1);
|
rb_define_singleton_method(rb_cTracePoint, "new", tracepoint_new_s, -1);
|
||||||
|
/*
|
||||||
|
* Document-method: trace
|
||||||
|
*
|
||||||
|
* call-seq:
|
||||||
|
* TracePoint.trace(*events) { |obj| block } -> obj
|
||||||
|
*
|
||||||
|
* A convenience method for TracePoint.new, that activates the trace
|
||||||
|
* automatically.
|
||||||
|
*
|
||||||
|
* trace = TracePoint.trace(:call) { |tp| [tp.lineno, tp.event] }
|
||||||
|
* #=> #<TracePoint:0x007f786a452448>
|
||||||
|
*
|
||||||
|
* trace.enabled? #=> true
|
||||||
|
*/
|
||||||
rb_define_singleton_method(rb_cTracePoint, "trace", tracepoint_trace_s, -1);
|
rb_define_singleton_method(rb_cTracePoint, "trace", tracepoint_trace_s, -1);
|
||||||
|
|
||||||
rb_define_method(rb_cTracePoint, "enable", tracepoint_enable_m, 0);
|
rb_define_method(rb_cTracePoint, "enable", tracepoint_enable_m, 0);
|
||||||
|
|
Loading…
Reference in a new issue