Там java-агент подключается к сигналу SIGQUIT. Я бы хотел избежать этого, потому что это тот же сигнал, который использует JVM для записи дампа потока в стандартный вывод. Я хочу избежать этого двуличия.
Просто удалите следующий фрагмент из своего кода
/* 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);
Я бы хотел присоединиться к другому сигналу
Вот немного старый, но информация должна быть актуальной.
Просто пример того, как обрабатывать сигнал
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 оттуда в любое время (обратные вызовы таймера и т. д.)
person
szhem
schedule
16.11.2014
GetStackTrace
напрямую. Есть ли причина, по которой вы не можете этого сделать? - person Paul Hicks   schedule 10.11.2014