From: Tanaka Akira Date: 2007-06-17T17:31:42+09:00 Subject: [ruby-dev:31014] full stack trace on exception Ruby は例外が捕捉されない場合、スタックトレースを表示してく れますが、そのとき、... 6 levels... などと途中を省略してくれ ます。 % ./ruby -e 'def m(n) if n == 0 then raise else m(n-1) end end m(16)' -e:1:in `raise': unhandled exception from -e:1:in `m' from -e:1:in `m' from -e:1:in `m' from -e:1:in `m' from -e:1:in `m' from -e:1:in `m' from -e:1:in `m' from -e:1:in `m' ... 6 levels... from -e:1:in `m' from -e:1:in `m' from -e:1:in `m' from -e:2:in `
' これは、無限再帰でスタックトレースがとんでもなく長くなった場 合にはありがたいのですが、必要な情報が隠れてしまうこともあり ます。 そのため、全部表示してほしいという要求が出てきて、ちょっと調 べただけでも [ruby-talk:56054], [ruby-talk:75008], [ruby-list:38810], [ruby-talk:86343], [ruby-talk:115962], [ruby-talk:159209], [ruby-core:6572], [ruby-talk:187642] で問題提起がなされています。 で、思ったのですが、発生した例外が SystemStackError でないと きは全部出すのはどうでしょうか。 Index: eval_error.h =================================================================== --- eval_error.h (リビジョン 12561) +++ eval_error.h (作業コピー) @@ -155,6 +155,7 @@ long i; long len = RARRAY_LEN(errat); VALUE *ptr = RARRAY_PTR(errat); + int truncate = eclass == rb_eSysStackError; #define TRACE_MAX (TRACE_HEAD+TRACE_TAIL+5) #define TRACE_HEAD 8 @@ -164,7 +165,7 @@ if (TYPE(ptr[i]) == T_STRING) { warn_printf("\tfrom %s\n", RSTRING_PTR(ptr[i])); } - if (i == TRACE_HEAD && len > TRACE_MAX) { + if (truncate && i == TRACE_HEAD && len > TRACE_MAX) { warn_printf("\t ... %ld levels...\n", len - TRACE_HEAD - TRACE_TAIL); i = len - TRACE_TAIL; -- [田中 哲][たなか あきら][Tanaka Akira]