public string GetCurrentBackTrace() { #if MRUBY System.Text.StringBuilder builder = new System.Text.StringBuilder(); R_VAL backtrace = RubyDLL.r_get_backtrace(rb_state); builder.AppendLine("trace:"); for (var i = 0; i < RubyDLL.r_funcall(rb_state, backtrace, "size", 0); ++i) { R_VAL v = RubyDLL.r_ary_ref(rb_state, backtrace, i); builder.AppendLine($" [{i}] {v.ToString ( rb_state )}"); } return(builder.ToString()); #else System.Text.StringBuilder builder = new System.Text.StringBuilder(); R_VAL exc = DoString("Exception.new('*interactive*')"); R_VAL backtrace = RubyDLL.r_get_backtrace(exc); builder.AppendLine("trace:"); for (var i = 0; i < RubyDLL.r_funcall(backtrace, R_VAL.Create("size"), 0); ++i) { R_VAL v = RubyDLL.r_ary_ref(backtrace, R_VAL.Create(i)); builder.AppendLine($" [{i}] {v.ToString ()}"); } return(builder.ToString()); #endif // return RubyDLL.mrb_inspect ( mrb_state, RubyDLL.mrb_get_backtrace ( mrb_state ) ).ToString ( mrb_state ); // return RubyDLL.mrb_funcall ( mrb_state, RubyDLL.mrb_exc_backtrace ( mrb_state, RubyDLL.mrb_get_exc_value ( mrb_state ) ), "to_s", 0 ).ToString ( mrb_state ); // return RubyDLL.mrb_inspect ( mrb_state, RubyDLL.mrb_get_exc_value ( mrb_state ) ).ToString ( mrb_state ); // return RubyDLL.mrb_inspect ( mrb_state, RubyDLL.mrb_exc_backtrace ( mrb_state, RubyDLL.mrb_get_exc_value ( mrb_state ) ) ).ToString ( mrb_state ); }