वहां, जावा एजेंट सिग्क्विट सिग्नल से जुड़ा हुआ है। मैं इससे बचना चाहता हूं, क्योंकि यह वही सिग्नल है जो जेवीएम स्टडआउट पर थ्रेड डंप लिखने के लिए उपयोग करता है। मैं उस डुप्लिकेट से बचना चाहता हूं।
बस अपने कोड से निम्नलिखित अंश को निकाल दें
/* Set callbacks and enable event notifications */
memset(&callbacks, 0, sizeof(callbacks));
callbacks.DataDumpRequest = &dumpThreadInfo;
err = (*jvmti)->SetEventCallbacks(jvmti, &callbacks, sizeof(callbacks));
CHECK_JVMTI_ERROR(jvmti, err);
err = (*jvmti)->SetEventNotificationMode(jvmti, JVMTI_ENABLE,JVMTI_EVENT_DATA_DUMP_REQUEST, NULL);
CHECK_JVMTI_ERROR(jvmti, err);
मैं या तो एक अलग संकेत
Here is कागज करने के लिए अटैच करना चाहते हैं, कि एक सा पुराना है, लेकिन जानकारी अभी भी प्रासंगिक होनी चाहिए।
बस कैसे एक संकेत
import sun.misc.Signal;
import sun.misc.SignalHandler;
public class ThreadDumpSignalHandler implements SignalHandler {
private volatile SignalHandler old;
private ThreadDumpSignalHandler() {
}
public static void register(String sigName) {
ThreadDumpSignalHandler h = new ThreadDumpSignalHandler();
h.old = Signal.handle(new Signal(sigName), h)
}
public void handle(Signal sig) {
threadDump();
if(old != null && old != SIG_DFL && old != SIG_IGN) {
old.handle(sig);
}
}
// call your own threadDump native method.
// note that in the implementation of this method you are able to access jvmtiEnv from *gdata (see below)
private native void threadDump();
}
ThreadDumpSignalHandler.register("INT");
आप पूरी तरह से देशी संकेत हैंडलर लिख सकते हैं कारण के
से निपटने क्या करने का एक नमूना (कृपया ध्यान दें कि मैं यह परीक्षण नहीं किया, यह सिर्फ एक विचार है कि काम करना चाहिए है)
static sighandler_t old_handler;
static void thread_dump_handler(int signum) {
if(gdata && gdata->jvmti) {
... get thread dump
}
if(old_handler) {
old_handler(signum);
}
}
JNIEXPORT jint JNICALL Agent_OnLoad(JavaVM *vm, char *options, void *reserved) {
old_handler = signal(SIGINT, thread_dump_handler);
...
}
या एजेंट समय-समय पर एक धागा डंप उत्पन्न करने के लिए के लिए एक रास्ता खोजने।
अपने नमूना में वैश्विक है * GData
typedef struct {
/* JVMTI Environment */
jvmtiEnv *jvmti;
jboolean vm_is_started;
/* Data access Lock */
jrawMonitorID lock;
} GlobalAgentData;
static GlobalAgentData *gdata;
... हां, तो बस किसी भी समय आप चाहते हैं (घड़ी कॉलबैक, आदि)
jvmtiEventCallbacks में से कोई भी घटना उपयुक्त नहीं दिखती है (जब तक आप DataDumpRequestion का उपयोग नहीं करना चाहते हैं, लेकिन यदि आपने किया, तो आप यहां नहीं पूछेंगे :))। ऐसा लगता है कि आप अपने एजेंट को 'GetStackTrace' को सीधे कॉल करने से सबसे अच्छे हैं। क्या कोई कारण है कि आप ऐसा नहीं कर सकते? –
@ पॉल-हिक्स, क्या आप इस मामले में jvm से कैसे संलग्न होंगे इस पर एक लिंक या कोड पोस्ट कर सकते हैं? – Ovesh
आपने एजेंट को डीएल या एसएसओ को अपने जेवीएम के-गैन्टपाथ में रखा है या इसे एगेंटलिब के रूप में परिभाषित किया है। [इस उत्तर] पर एक नज़र डालें (http://stackoverflow.com/a/173447/3195526) या [आईबीएम के परिचय पृष्ठ] (http://publib.boulder.ibm.com/infocenter/realtime/v2r0/index। jsp? topic =% 2Fcom.ibm.rt.doc.20% 2Fdiag% 2Ftools% 2Fjvmti.html)। क्या यह आप जानना चाहते थे? क्या मुझे इसे एक जवाब में बदलना चाहिए? –