簡単なハックとして、これは私が思っていたよりもはるかに簡単でした。これは簡単なハックなので、配列を逆参照する前にスタックトレースが十分に深いことを確認するなどのことはしませんでした。署名されたアプレットのコンストラクターに、次のものを挿入しました。
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()
。