Question

Je suis en train d'écrire un profileur court et simple (en C), qui est destinée à imprimer des traces de pile pour les fils dans les différents clients Java à intervalles réguliers. Je dois utiliser la fonction non documentée AsyncGetCallTrace au lieu de getStackTrace pour réduire au minimum l'intrusion et permettre des traces de pile quel que soit l'état de fil. Le code source de la fonction peut être trouvée ici: http://download.java.net/openjdk/jdk6/promoted/b20/openjdk-6-src-b20-21_jun_2010.tar.gz à point chaud / src / share / vm / prims / forte.cpp. J'ai trouvé quelques pages de manuel documentant JVMTI, traitement du signal, et le calendrier, ainsi qu'un blog avec des détails sur la façon de configurer l'appel AsyncGetCallTrace: http: // jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi- SIGPROF-and.html.

Qu'est-ce que ce blog manque est le code pour réellement appeler la fonction dans le gestionnaire de signal (l'auteur suppose que le lecteur peut le faire sur son / sa propre). Je demande de l'aide à faire exactement cela. Je ne sais pas comment et où créer le ASGCT_CallTrace struct (et le ASGCT_CallFrame struct interne), tel que défini dans le forte.cpp de fichier mentionné ci-dessus. Le ASGCT_CallTrace struct est l'un des paramètres passés à AsyncGetCallTrace, donc je besoin de le créer, mais je ne sais pas comment obtenir les valeurs correctes pour ses champs: JNIEnv * env_id, num_frames de JINT et JVMPI_CallFrame cadres. De plus, je ne sais pas ce que le troisième paramètre passé à AsyncGetCallTrace (void ucontext) est censé être?

Le problème ci-dessus est le principal que j'ai. Cependant, d'autres questions que je suis confronté à comprennent: [1] SIGPROF ne semble pas être soulevée par la minuterie exactement aux intervalles spécifiés, mais un peu moins fréquemment. C'est, si je régler la minuterie pour envoyer un SIGPROF chaque seconde (1 s, 0 USEC), puis dans 5 secondes course, je reçois moins de 5 sorties de gestionnaire de SIGPROF (en général 1-3) [2] sorties de gestionnaire SIGPROF ne semble pas du tout lors d'une Thread.sleep dans le code Java. Donc, si un SIGPROF doit être envoyé à chaque seconde, et j'ai Thread.sleep (5000) ;, je n'obtenir aucune sortie de gestionnaire lors de l'exécution de ce code.

Toute aide serait appréciée. Des détails supplémentaires (ainsi que des parties de sorties code et échantillons) seront affichés sur demande.

Merci!

Était-ce utile?

La solution

J'ai finalement eu un résultat positif, mais depuis peu de discussion a été donné naissance ici, ma réponse sera brève.

La structure de ASGCT_CallTrace (et la matrice de sous-jacent ASGCT_CallFrame) peut simplement être déclaré dans le gestionnaire de signaux, existant ainsi que la pile: ASGCT_CallTrace trace; JNIEnv * env; global_VM_pointer-> AttachCurrentThread ((void **) et env, NULL); trace.env_id = env; trace.num_frames = 0; stockage ASGCT_CallFrame [25]; trace.frames = stockage;

Le tableau suivant obtient le uContext: ucontext_t uContext; getcontext (& uContext);

Et l'appel est juste: AsyncGetCallTrace (& trace, 25, & uContext);

Je suis sûr qu'il ya d'autres nuances que je devais prendre en charge dans le processus, mais je ne documentait pas vraiment. Je ne suis pas sûr que je peux divulguer le plein code actuel je, qui demande avec succès et de manière asynchrone pour des traces pile de tout programme obtient java à intervalles fixes. Mais si quelqu'un est intéressé ou coincé sur le même problème, je suis en mesure d'aider (je pense).

Sur les deux autres questions: [1] Si un fil dort et un SIGPROF est généré, les poignées de fil que le signal seulement après le réveil. Ceci est normal, car il est le travail du thread pour gérer le signal. [2] Les imperfections de la minuterie ne semblent pas apparaître plus. Peut-être que mal mesurée.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top