Bug #7635

debug_inspector API segfaults when opened from inside an eval frame

Added by Charlie Somerville about 2 years ago. Updated about 2 years ago.

[ruby-core:51192]
Status:Closed
Priority:High
Assignee:Koichi Sasada
ruby -v:ruby 2.0.0dev (2012-12-29 trunk 38656) [x86_64-darwin11.4.0] Backport:

Description

=begin

(({rb_debug_inspector_open})) segfaults when it is called from inside an eval frame.

Using this C extension:

#include "ruby/ruby.h"

static VALUE
cb()
{
return Qnil;
}

static VALUE
debug_inspector()
{
return rb_debug_inspector_open(cb, NULL);
}

void
Init_debug_inspector()
{
rb_define_global_function("debug_inspector", debug_inspector, 0);
}

Calling (({debug_inspector})) from the top level and from within methods works fine, calling inside eval from the top level works fine, but calling inside eval from within a method segfaults.

Here is a test program that segfaults:

require "./debug_inspector" # the c extension above

def x
eval "debug_inspector"
end

x

=end

Associated revisions

Revision 38970
Added by Koichi Sasada about 2 years ago

  • vm_backtrace.c: fix issue of rb_debug_inspector_open(). The order of making binding should be stack (frame) top to bottom. [Bug #7635] And also fix issue of collecting klass. Collecting klass is same as TracePoint#defined_class. (previous version, it returns T_ICLASS (internal objects).
  • test/-ext-/debug/test_debug.rb: add a test.
  • ext/-test-/debug/extconf.rb, init.c, inspector.c: ditto.
  • vm_backtrace.c: remove magic number and add enum CALLER_BINDING_*.
  • vm_backtrace.c, include/ruby/debug.h: add new C api (experimental) rb_debug_inspector_frame_self_get().
  • vm.c, vm_core.h, vm_trace.c: move decl. of rb_vm_control_frame_id_and_class() and constify first parameter.

Revision 38970
Added by Koichi Sasada about 2 years ago

  • vm_backtrace.c: fix issue of rb_debug_inspector_open(). The order of making binding should be stack (frame) top to bottom. [Bug #7635] And also fix issue of collecting klass. Collecting klass is same as TracePoint#defined_class. (previous version, it returns T_ICLASS (internal objects).
  • test/-ext-/debug/test_debug.rb: add a test.
  • ext/-test-/debug/extconf.rb, init.c, inspector.c: ditto.
  • vm_backtrace.c: remove magic number and add enum CALLER_BINDING_*.
  • vm_backtrace.c, include/ruby/debug.h: add new C api (experimental) rb_debug_inspector_frame_self_get().
  • vm.c, vm_core.h, vm_trace.c: move decl. of rb_vm_control_frame_id_and_class() and constify first parameter.

History

#1 Updated by Koichi Sasada about 2 years ago

  • Category set to core
  • Status changed from Open to Assigned
  • Assignee set to Koichi Sasada
  • Priority changed from Normal to High
  • Target version set to 2.0.0

Ah.. I missed this ticket.

#2 Updated by Koichi Sasada about 2 years ago

  • Status changed from Assigned to Closed
  • % Done changed from 0 to 100

This issue was solved with changeset r38970.
Charlie, thank you for reporting this issue.
Your contribution to Ruby is greatly appreciated.
May Ruby be with you.


  • vm_backtrace.c: fix issue of rb_debug_inspector_open(). The order of making binding should be stack (frame) top to bottom. [Bug #7635] And also fix issue of collecting klass. Collecting klass is same as TracePoint#defined_class. (previous version, it returns T_ICLASS (internal objects).
  • test/-ext-/debug/test_debug.rb: add a test.
  • ext/-test-/debug/extconf.rb, init.c, inspector.c: ditto.
  • vm_backtrace.c: remove magic number and add enum CALLER_BINDING_*.
  • vm_backtrace.c, include/ruby/debug.h: add new C api (experimental) rb_debug_inspector_frame_self_get().
  • vm.c, vm_core.h, vm_trace.c: move decl. of rb_vm_control_frame_id_and_class() and constify first parameter.

Also available in: Atom PDF