Pregunta

Estoy escribiendo un perfilador corto y simple (en C), que está destinada a imprimir los seguimientos de pila de subprocesos en varios clientes de Java, a intervalos regulares. Tengo que usar la AsyncGetCallTrace función indocumentado en lugar de getStackTrace para minimizar la intrusión y permitir trazas de la pila independientemente del estado del hilo. El código fuente de la función se puede encontrar aquí: http://download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz en el punto de acceso / src / share / vm / PRIM / forte.cpp. He encontrado algunas páginas man que documentan JVMTI, el manejo de señales, y el tiempo, así como un blog con información sobre cómo establecer la llamada AsyncGetCallTrace: http: // jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi- SIGPROF-and.html.

Lo que este blog es que falta es el código para realmente invocar la función dentro del manejador de la señal (el autor asume que el lector puede hacer esto en su / su propio). Estoy pidiendo ayuda para hacer exactamente esto. No estoy seguro de cómo y dónde crear la estructura ASGCT_CallTrace (y el ASGCT_CallFrame estructura interna), como se define en el fichero anteriormente referido forte.cpp. El ASGCT_CallTrace estructura es uno de los parámetros pasados ??a AsyncGetCallTrace, por lo que la necesidad de crear, pero no sé cómo obtener los valores correctos para sus campos: * JNIEnv env_id, num_frames Jint y JVMPI_CallFrame marcos. Por otra parte, no sé lo que el tercer parámetro pasado a AsyncGetCallTrace (void ucontext) se supone que es?

El problema anterior es el principal que estoy teniendo. Sin embargo, otras cuestiones estoy frente a incluyen: No parece [1] SIGPROF ser levantado por el temporizador exactamente en los intervalos especificados, sino más bien un poco menos frecuencia. Es decir, si fijo el temporizador para enviar un SIGPROF cada segundo (1 s, 0 USEC), a continuación, en una segunda carrera de 5, que estoy recibiendo menos de 5 salidas de controlador SIGPROF (generalmente 1-3) [2] salidas de controlador SIGPROF no aparecen en absoluto durante un Thread.sleep en el código Java. Por lo tanto, si un SIGPROF se va a enviar a cada segundo, y tengo Thread.sleep (5000) ;, que no recibirá salidas de controlador durante la ejecución de dicho código.

Cualquier ayuda sería apreciada. Detalles adicionales (así como partes de código y salidas de muestra) se publicarán bajo petición.

Gracias!

¿Fue útil?

Solución

Finalmente llegué un resultado positivo, pero desde pequeña discusión se generó aquí, mi propia respuesta a ser breve.

La estructura ASGCT_CallTrace (y la matriz ASGCT_CallFrame subyacente) puede simplemente ser declarada en el manejador de la señal, por lo que existe sólo la pila: rastro ASGCT_CallTrace; JNIEnv * env; global_VM_pointer-> AttachCurrentThread ((void **) y env, NULL); trace.env_id = env; trace.num_frames = 0; almacenamiento ASGCT_CallFrame [25]; trace.frames = almacenamiento;

La siguiente obtiene el uContext: ucontext_t uContext; getcontext (y uContext);

Y entonces la llamada es simplemente: AsyncGetCallTrace (& trace, 25, y uContext);

Estoy seguro de que hay algunos otros matices que tenía que atender en el proceso, pero que realmente no documentarlos. No estoy seguro de que pueda revelar el código actual completa que tengo, que solicita de forma asincrónica y obtiene pila rastros de cualquier programa de java a intervalos fijos. Pero si alguien está interesado en o pegado en el mismo problema, ahora soy capaz de ayuda (creo).

En las otras dos cuestiones: [1] Si un hilo está durmiendo y se genera una SIGPROF, los mangos de rosca que indican solamente después de despertarse. Esto es normal, ya que es el trabajo del hilo para manejar la señal. [2] No parece que estas imperfecciones del temporizador a aparecer más. Tal vez mal medido.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top