From: "ko1 (Koichi Sasada)" Date: 2012-11-15T21:31:04+09:00 Subject: [ruby-core:49369] [ruby-trunk - Bug #7214] Ruby 2.0 breaks support for some debugging tools Issue #7214 has been updated by ko1 (Koichi Sasada). =begin [PLEASE REVIEW!!] = Abstract I made debugger support interface. https://github.com/ko1/ruby/compare/debugger_api Currently, no docs, no tests. Sorry for my laziness. Please review it. = Background Generally, debugger needs two features. (1) Flow (execution) control API (2) Inpsection API For (1), inserting breakpoints, watch points and so on. However, I don't touch these features because of no time to discuss. (set_trace_func and TracePoint will help it) For (2), (2-1) inspecting current thread's frames, (2-2) thread frames and (2-3) global environment. We can access (2-3) using Ruby's powerful reflecting features (such as global_variables and so on). We lacks (2-1) and (2-2). Currently, we don't have flow control features ((1)'s feature) to stop other threads. So I decide to support only (2-1) "inspecting current thread's frames". To make (2-1), `Binding.of_caller' (which is supported by 'binding_of_caller') gem is almost enough for debugger. However, `Binding.of_caller' is too powerful and it can break Ruby's semantics. I feel that we need to restrict for debugging purpose. = API With above consideration, I made a new C/Ruby API. https://github.com/ko1/ruby/compare/debugger_api == C-Level APIs Types: * typedef struct rb_debug_inspector_struct rb_debug_inspector_t; * typedef VALUE (*rb_debug_inspector_func_t)(const rb_debug_inspector_t *, void *); Functions: * VALUE rb_debug_inspector_open(rb_debug_inspector_func_t func, void *data); * VALUE rb_debug_inspector_frame_binding_get(const rb_debug_inspector_t *dc, int index); * VALUE rb_debug_inspector_frame_class_get(const rb_debug_inspector_t *dc, int index); * VALUE rb_debug_inspector_backtrace_locations(const rb_debug_inspector_t *dc); == Ruby-level APIs (RubVM::DebugInspector) You can use the following APIs after "require 'rubyvm/debug_inspector'". * RubVM::DebugInspector.open{|inspector| ...} * RubVM::DebugInspector#backtrace_locations #=> locations array * RubVM::DebugInspector#frame_binding(i) #=> i-th binding. Generated bindings can be `broken' outside of `RubVM::DebugInspector.open' block to avoid abusing this powerful feature (now, they are not broken) * RubVM::DebugInspector#frame_class(i) #=> i-th method class Ruby level API is sample code of C-level APIs. == Sample code The following sample code is very simple debugger (breakpoint). require 'rubyvm/debug_inspector' def breakpoint RubyVM::DebugInspector.open{|inspector| $inspector = inspector inspector.backtrace_locations.each_with_index{|location, i| b = inspector.frame_binding(i) # binding is nil if it is for when C's context vars = b ? b.eval('local_variables') : [] puts [i, location.to_s, vars, b, inspector.frame_class(i)].inspect } } end def foo foo_a = foo_b = nil breakpoint end hello = 1 foo begin # DebugInspector object is not active outside block of # RubyVM::DebugInspector.open p $inspector.backtrace_locations rescue ArgumentError => e p [:ok, e] end = Consideration == Satisfaction I'm sorry I don't make surveys about debugger APIs for current CRuby's debugger and debuggers for alternative Ruby implementations. Please point out that it is enough or not enough, misunderstood and so on. == Toward Ruby 2.0.0 Ruby 2.0.0 spec was already frozen :( Make debug_inspector gem for 2.0.0? =end ---------------------------------------- Bug #7214: Ruby 2.0 breaks support for some debugging tools https://bugs.ruby-lang.org/issues/7214#change-32925 Author: banister (john mair) Status: Open Priority: Normal Assignee: ko1 (Koichi Sasada) Category: core Target version: 2.0.0 ruby -v: ruby 2.0.0dev (2012-10-18 trunk 37260) [x86_64-linux] Notably the "Pry" debugger breaks, and (though i haven't checked) I'm assuming the 'debugger' project as well. The reason for the breakages (as far as i can see) is that the `rb_vm_make_env_object` function is now hidden. In the comments for 1.9.3's vm.c it was stated an alternative API for `rb_vm_make_env_object` (see https://github.com/ruby/ruby/blob/ruby_1_9_3/vm.c#L53-60) would be provided, but I have been unable to find one. Can you please inform me of where I can find the new API (if it exists), or alternatively, provide a work-around so we can get the debuggers working on Ruby 2.0 Thanks -- http://bugs.ruby-lang.org/