में गायब java_pid फ़ाइल के कारण मेरे स्वयं के प्रोफाइलर का निर्माण, मैं मूल पुस्तकालय एजेंट बनाने के लिए JVMTI API का उपयोग करता हूं। अतिरिक्त पैरामीटर -agentlib का उपयोग करके यह एजेंट JVM के साथ एक साथ शुरू किया जा सकता है। इसके अलावा Attach एपीआई है जो एक एजेंट को चल रहे JVM में इंजेक्ट करने की अनुमति देता है। मैं निम्नलिखित कोड का उपयोग कर अपने प्रोफाइलर को इस प्रोफाइल को कार्यान्वित करना चाहता था:AttachNotSupportedException अटैच एपीआई
try {
String pid = VirtualMachine.list().get(0).id();
VirtualMachine vm = VirtualMachine.attach(pid);
vm.loadAgentLibrary("agent");
} catch (AgentLoadException e1) {
e1.printStackTrace();
} catch (AgentInitializationException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
} catch (AttachNotSupportedException e) {
e.printStackTrace();
}
यह क्या करता है? सभी उपलब्ध चल रहे आभासी मशीनों (VirtualMachine.list()
) से मैं पहला चुनता हूं, इसे संलग्न करता हूं और अपने एजेंट को इसमें लोड करने का प्रयास करता हूं। एजेंट, libagent.so नामित यूनिक्स सिस्टम पर पाया जा सकता है, लेकिन जब एजेंट लोड करने का प्रयास निम्न अपवाद फेंक दिया जाता है:
com.sun.tools.attach.AttachNotSupportedException:
Unable to open socket file:
target process not responding or HotSpot VM not loaded.
स्रोत कोड में देख रहे हैं, यह अपवाद फेंक दिया जाता है, क्योंकि यह नहीं मिल सकता है .java_pid<pid>
नाम की एक फ़ाइल। मुझे दस्तावेज में इस तरह की फाइल के बारे में बहुत सारी जानकारी नहीं मिली है। मैंने अक्सर सुना है कि इस तरह की फाइल का उपयोग नहीं किया जाता है, लेकिन मैं जावा 1.6 चला रहा हूं।
मैंने अन्य जेवीएम को भी संलग्न करने का प्रयास किया, असल में मैंने इस संलग्न प्रक्रिया को गतिशील रखा, परीक्षण कारणों से मैं किसी भी JVM से अटैच करने का प्रयास करता हूं।
// Return the socket file for the given process.
// Checks working directory of process for .java_pid<pid>. If not
// found it looks in /tmp.
private String findSocketFile(int pid) {
// First check for a .java_pid<pid> file in the working directory
// of the target process
String fn = ".java_pid" + pid;
String path = "/proc/" + pid + "/cwd/" + fn;
File f = new File(path);
if (!f.exists()) {
// Not found, so try /tmp
path = "/tmp/" + fn;
f = new File(path);
if (!f.exists()) {
return null; // not found
}
}
return path;
}
इसे कहते हैं, यह /proc/<pid>
निर्देशिका में जड़ से देख रहा है:
इस कोड को जो अपवाद, sun.tools.attach: LinuxVirtualMachine.java से लिया की ओर जाता है है। JDK7 इसके बारे में एक changeset को देखते हुए लगता है कि वे कोड JDK7 Changeset to LinuxVirtualMachine
उसी उपयोगकर्ता के रूप में चलाएं, जीतें, धन्यवाद। –
उसी उपयोगकर्ता के साथ काम किया! आपका बहुत बहुत धन्यवाद! – Gonzalo
मैं रूट के रूप में उपयोग कर रहा हूं लेकिन त्रुटि से नीचे आ रहा हूं। त्रुटि: अटैचिंग समर्थित नहीं है: सॉकेट फ़ाइल खोलने में असमर्थ: लक्ष्य प्रक्रिया प्रतिक्रिया नहीं दे रही है या हॉटस्पॉट वीएम लोड नहीं किया गया com.sun.tools.attach.AttachNotSupportedException: सॉकेट फ़ाइल खोलने में असमर्थ: लक्ष्य प्रक्रिया प्रतिसाद नहीं दे रही है या हॉटस्पॉट वीएम लोड नहीं है –