Domanda

Sto scrivendo una breve e semplice Profiler (in C), che ha lo scopo di stampare tracce di stack per le discussioni in vari client Java a intervalli regolari. Devo usare la funzione AsyncGetCallTrace documentata anziché getStackTrace per minimizzare intrusione e consentire stack indipendentemente dallo stato del filo. Il codice sorgente per la funzione può essere trovato qui: http://download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz in hotspot / src / share / vm / prims / forte.cpp. Ho trovato alcune pagine man che documentano JVMTI, gestione del segnale, e la tempistica, così come un blog con i dettagli su come impostare la chiamata AsyncGetCallTrace: http: // jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi- sigprof-and.html.

Che questo blog che manca è il codice effettivamente richiamare la funzione all'interno del gestore di segnale (l'autore presuppone che il lettore può fare questo sulla sua / il suo proprio). Chiedo aiuto per fare esattamente questo. Io non sono sicuro di come e dove creare l'ASGCT_CallTrace struct (e l'ASGCT_CallFrame struct interna), come definito nel citato forte.cpp file. L'ASGCT_CallTrace struct è uno dei parametri passati al AsyncGetCallTrace, così faccio necessità di creare, ma non so come ottenere i valori corretti per i suoi campi: MEnv * env_id, num_frames jint, e JVMPI_CallFrame frame. Inoltre, non so che cosa il terzo parametro passato a AsyncGetCallTrace (vuoto ucontext) si suppone che sia?

Il problema di cui sopra è quello principale che sto avendo. Tuttavia, altre questioni mi trovo davanti a includono: [1] SIGPROF non sembra essere sollevato dal timer esattamente agli intervalli specificati, ma piuttosto un po 'meno frequentemente. Cioè, se ho impostato il timer per inviare un SIGPROF ogni secondo (1 sec, 0 usec), poi in un secondo run 5, io sono sempre meno di 5 uscite gestore SIGPROF (di solito 1-3) [2] uscite gestore SIGPROF non sembrano affatto durante un Thread.sleep nel codice Java. Quindi, se un SIGPROF deve essere inviato ogni secondo, e non ho Thread.sleep (5000) ;, non avrà nessuna uscite del gestore durante l'esecuzione di tale codice.

Qualsiasi aiuto sarebbe apprezzato. Ulteriori dettagli (così come le parti di codice e uscite campione) saranno pubblicati su richiesta.

Grazie!

È stato utile?

Soluzione

Finalmente ho avuto un risultato positivo, ma fin da piccolo la discussione è stato generato qui, la mia risposta sarà breve.

La struttura ASGCT_CallTrace (e l'array ASGCT_CallFrame sottostante) può semplicemente essere dichiarato nel gestore segnale, così che esiste solo stack: traccia ASGCT_CallTrace; MEnv * env; global_VM_pointer-> AttachCurrentThread ((void **) e env, NULL); trace.env_id = env; trace.num_frames = 0; stoccaggio ASGCT_CallFrame [25]; trace.frames = stoccaggio;

Di seguito ottiene l'uContext: ucontext_t uContext; getContext (& uContext);

E poi la chiamata semplicemente è: AsyncGetCallTrace (& trace, 25, e uContext);

Sono sicuro che ci sono alcune altre sfumature che ho dovuto prendere cura nel processo, ma non ho davvero li documento. Io non sono sicuro di poter rivelare il codice corrente completo che ho, che richiede con successo in modo asincrono ed ottiene pila tracce di qualsiasi programma Java a intervalli fissi. Ma se qualcuno è interessato o bloccati sullo stesso problema, sono ora in grado di aiuto (credo).

Sulle altre due questioni: [1] Se un thread sta dormendo e SIGPROF viene generato, le maniglie filo che segnalano solo dopo il risveglio. Questo è normale, dal momento che è compito del thread per gestire il segnale. [2] Le imperfezioni del timer non sembrano apparire più. Forse mis-misurato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top