एक त्वरित हैक के रूप में, यह एक बहुत आसान करने के लिए की तुलना में मैंने सोचा कि यह होता था। चूंकि यह एक त्वरित हैक है, मैं चीजों को नहीं किया सुनिश्चित की तरह है कि स्टैक ट्रेस काफी गहरी है सरणी, आदि अपसंदर्भन से पहले मैं अपने हस्ताक्षर किए एप्लेट के निर्माता में निम्नलिखित डाला:
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