Beispiel #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 ();
        }