В этом случае агент java прикрепляется к сигналу SIGQUIT. Я бы хотел этого избежать, потому что это тот же сигнал, что и JVM для записи дампа потока в stdout. Я хочу избежать этой двуличности.
Просто удалите следующий фрагмент из кода
/* 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;
... так, просто получить jvmtiEnv оттуда в любое время вы хотите (обратные вызовы таймера и т.д.)
Ни одно из событий в jvmtiEventCallbacks не подходит (если вы не хотите использовать DataDumpRequestion, но если вы это сделали, вы не спрашивали здесь :)). Похоже, вам лучше всего позвонить своему агенту прямо в GetStackTrace. Есть ли причина, по которой вы не можете этого сделать? –
@ Paul-Hicks, Не могли бы вы разместить ссылку или код о том, как я буду прикреплять к jvm в этом случае? – Ovesh
Вы помещаете dll агента или .so в ваш -ventpath вашего jvm или определяете его как -agentlib. Взгляните на [этот ответ] (http://stackoverflow.com/a/173447/3195526) или [вводная страница IBM] (http://publib.boulder.ibm.com/infocenter/realtime/v2r0/index. JSP? тема =% 2Fcom.ibm.rt.doc.20% 2Fdiag% 2Ftools% 2Fjvmti.html). Это то, что вы хотели знать? Должен ли я превратить это в ответ? –