Esempio n. 1
0
        /// <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 ();
        }
Esempio n. 2
0
        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
        }