Là một hack nhanh chóng, đây là dễ dàng hơn rất nhiều để làm hơn tôi nghĩ nó sẽ là. Do đây là một cách nhanh chóng hack, tôi không làm những việc như đảm bảo rằng các vết đống là đủ sâu trước dereferencing mảng, vv Tôi chèn như sau trong ký constructor của tôi Applet của:
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);
}
});
và dumpThreadStack
phương pháp là như sau:
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());
}
tôi có thể không bao giờ, tất nhiên, để lại điều này trong mã sản xuất, nhưng nó đủ để cho tôi biết chính xác chủ đề đã gây ra một interrupt()
mà tôi không mong đợi. Đó là, với mã này tại chỗ, tôi nhận được một bãi chứa stack cho mỗi cuộc gọi đến Thread.interrupt()
.
Tôi có thể nghĩ ra một số cách để làm điều đó với độ phức tạp khác nhau và số lần truy cập hiệu suất khác nhau. Nó là một điều một lần để tìm một lỗi hoặc là nó một cái gì đó bạn muốn trong sản xuất? – Fredrik
Đây chủ yếu là điều tôi muốn làm một lần, nhưng điều mà tôi biết tôi thỉnh thoảng muốn sử dụng. Nếu nó là đủ thân thiện, tôi sẽ để nó trong mã sản xuất nhưng bị vô hiệu hóa như là một chế độ bổ sung của gỡ lỗi từ xa (thông qua các bản ghi) được sử dụng khi cần thiết. – Eddie