、これは私はそれが可能だろうと思ったよりも行うことがたくさん簡単でした。このクイックハックですが、私はなど、スタックトレースは、配列を参照解除する前に十分な深さであることを保証するようなことをしなかったので、私は私の署名付きアプレットのコンストラクタに次のように挿入:
log.info("Old security manager = " + System.getSecurityManager());
System.setSecurityManager(new SecurityManager() {
@Override
public void checkAccess(final Thread t) {
StackTraceElement[] list = Thread.currentThread().getStackTrace();
StackTraceElement element = list[3];
if (element.getMethodName().equals("interrupt")) {
log.info("CheckAccess to interrupt(Thread = " + t.getName() + ") - "
+ element.getMethodName());
dumpThreadStack(Thread.currentThread());
}
super.checkAccess(t);
}
});
とdumpThreadStack
方法以下のとおりである。
public static void dumpThreadStack(final Thread thread) {
StringBuilder builder = new StringBuilder('\n');
try {
for (StackTraceElement element : thread.getStackTrace()) {
builder.append(element.toString()).append('\n');
}
} catch (SecurityException e) { /* ignore */ }
log.info(builder.toString());
}
私は、もちろん、生産コードでこれを残すことができませんでしたが、それは私が期待していなかったinterrupt()
を引き起こしたスレッドを正確に私に教えて足ります。つまり、このコードを使用して、Thread.interrupt()
への呼び出しごとにスタックダンプを取得します。
さまざまな複雑さとパフォーマンスのヒットでいくつかの方法を考えることができます。バグを発見するのは一度だけですか、それともあなたがプロダクションで望むものなのでしょうか? – Fredrik
これは主に私が一度限りのものとして欲しいものですが、私が随時使用したいと思うものです。それが充分フレンドリーだったら、私はプロダクションコードにしておきますが、必要に応じてリモートデバッグ(ログ経由)の追加モードを無効にします。 – Eddie