/// <summary> /// 获取当前异常调用堆栈信息 /// https://qiita.com/seanchas_t/items/ca293f9dd4454cd6cb6d /// </summary> public string GetExceptionBackTrace() { System.Text.StringBuilder builder = new System.Text.StringBuilder(); R_VAL exc = RubyDLL.mrb_get_exc_value(rb_state); if (!RubyDLL.mrb_exception_p(exc)) { return(string.Empty); } R_VAL backtrace = RubyDLL.r_exc_backtrace(rb_state, exc); builder.AppendLine(RubyDLL.r_funcall(rb_state, exc, "inspect", 0).ToString(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()); // R_VAL exc = RubyDLL.rb_errinfo (); // R_VAL backtrace = RubyDLL.r_exc_backtrace ( exc ); // // builder.AppendLine ( RubyDLL.r_inspect ( exc ).ToString () ); // // 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 (); }
public static string GetExceptionBackTrace() { #endif System.Text.StringBuilder builder = new System.Text.StringBuilder(); #if MRUBY R_VAL exc = RubyDLL.mrb_get_exc_value(mrb); R_VAL backtrace = RubyDLL.r_exc_backtrace(mrb, exc); builder.AppendLine(RubyDLL.r_funcall(mrb, exc, "inspect", 0).ToString(mrb)); builder.AppendLine("trace:"); for (var i = 0; i < RubyDLL.r_funcall(mrb, backtrace, "size", 0); ++i) { R_VAL v = RubyDLL.r_ary_ref(mrb, backtrace, i); builder.AppendLine($" [{i}] {v.ToString ( mrb )}"); } return(builder.ToString()); #else R_VAL exc = RubyDLL.rb_errinfo(); R_VAL backtrace = RubyDLL.r_exc_backtrace(exc); builder.AppendLine(RubyDLL.rb_obj_inspect(exc).ToString()); 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 }