無意味なスタックトレースの伸ばし方
JavaのThrowableがもつスタックトレースはThrowableオブジェクトがnewされたときに、
VMのスタックを見に行きトレースを埋めるという仕様になっているらしい。
Throwableのコンストラクタでは、nativeメソッドThrowable.fillInStackTraceが必ず呼ばれている。
そこで
再帰でスタックを積んだところで例外をnewするとスタックトレースを伸ばすことができる。
スローする場所は関係ない。
package hoge; public class ThrowableExp3 extends RuntimeException{ public static void main(String[] args) { Throwable t = makeThrowable(null, 10); try { throw t; } catch (Throwable e) { e.printStackTrace(); } } public static Throwable makeThrowable(Throwable t, int n){ Throwable t2 = new Throwable("throwable" + n , t); if(n <= 0){ return t2; } return makeThrowable(t2, n-1); } }
Throwableのcauseは、スタックの上から降ってきたThrowableをcatchして
下に投げるというのが普通の使い方。
スタックの下からやってきたThrowable(makeThrowableの引数)を原因にすると、意味がないトレースを吐くことができる。