Frage

Ich schreibe eine kurze und einfache Profiler (in C), die in regelmäßigen Abständen zum Ausdrucken Stack-Traces für Threads in verschiedenen Java-Clients gedacht. Ich habe die nicht dokumentierte Funktion AsyncGetCallTrace anstelle von getStackTrace verwenden Eindringens zu minimieren und ermöglichen die Stapel Spuren unabhängig von Thread-Zustand. Der Quellcode für die Funktion finden Sie hier: 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. Ich fand einige man-Seiten zu dokumentieren JVMTI, Signalverarbeitung und Timing sowie einen Blog mit Informationen darüber, wie die AsyncGetCallTrace Anruf einzurichten: http: // jeremymanson.blogspot.com/2007/05/profiling-with-jvmtijvmpi- sigprof-and.html.

Was Blog fehlt, ist der Code tatsächlich rufen Sie die Funktion innerhalb der Signal-Handler (der Autor nimmt den Leser können dies tun, auf seine / ihre eigenen). Ich bitte um Hilfe bei der genau dies zu tun. Ich bin nicht sicher, wie und wo die Struktur ASGCT_CallTrace zu erstellen (und die interne Struktur ASGCT_CallFrame), wie in der oben genannten Datei forte.cpp definiert. Die Struktur ASGCT_CallTrace ist einer der Parameter zu AsyncGetCallTrace weitergegeben, so brauche ich es zu schaffen, aber ich weiß nicht, wie die richtigen Werte für die Felder zu erhalten: JNIEnv * env_id, JINT num_frames und JVMPI_CallFrame Frames. Außerdem weiß ich nicht, was der dritte Parameter zu AsyncGetCallTrace geben (void ucontext) sollte sein?

Das obige Problem ist das wichtigste das ich habe. Aber auch andere Fragen, die ich konfrontiert bin mit einschließen: [1] SIGPROF scheint nicht durch den Timer genau in den angegebenen Intervallen, sondern etwas weniger häufig erhöht werden. Das heißt, wenn ich den Timer einem SIGPROF jede Sekunde (1 s, 0 & mgr; s), dann in 5 Sekunden laufen zu senden, erhalte ich weniger als 5 SIGPROF Handler Ausgänge (in der Regel 1-3) [2] SIGPROF Handler Ausgaben überhaupt nicht in dem Java-Code während einer Thread.sleep erscheinen. Wenn also ein SIGPROF jede Sekunde gesendet werden soll, und ich habe Thread.sleep (5000) ;, ich nicht während der Ausführung des Codes keine Handler Ausgänge erhalten.

Jede mögliche Hilfe würde geschätzt. Weitere Einzelheiten (wie auch Teile des Codes und Proben Ausgänge) werden auf Anfrage gebucht werden.

Danke!

War es hilfreich?

Lösung

Ich habe endlich ein positives Ergebnis, aber da wenig Diskussion hier hervorgebracht wurde, wird meine eigene Antwort kurz sein.

Die ASGCT_CallTrace Struktur (und die zugrunde liegende ASGCT_CallFrame Array) können einfach in den Signal-Handler deklariert werden, bestehende somit nur der Stapel: ASGCT_CallTrace Spur; JNIEnv * env; global_VM_pointer-> AttachCurrentThread ((void **) & env, NULL); trace.env_id = env; trace.num_frames = 0; ASGCT_CallFrame Lagerung [25]; trace.frames = Lagerung;

Im Folgenden wird die uContext: ucontext_t uContext; getContext (& uContext);

Und dann ist der Anruf einfach: AsyncGetCallTrace (& Trace, 25, & uContext);

Ich bin sicher, dass einige andere Nuancen gibt es, dass ich die Pflege in dem Prozess zu nehmen hatte, aber ich habe sie wirklich nicht dokumentieren. Ich bin nicht sicher, kann ich den vollen aktuellen Code offen lege Ich habe, die erfolgreich asynchron Anträge auf und erhält Stack-Traces von jedem Java-Programm in festgelegten Intervallen. Aber wenn jemand in oder stecken auf dem gleichen Problem interessiert ist, bin ich nun in der Lage zu helfen (glaube ich).

Auf den anderen beiden Fragen: [1] Wenn ein Thread schläft und ein SIGPROF erzeugt wird, die Fäden Griffe, die nur das Signal nach dem Aufwachen. Das ist normal, da es die Threads Aufgabe ist es, das Signal zu verarbeiten. [2] Die Timer Mangel scheinen nicht mehr zu erscheinen. Vielleicht ich falsch gemessen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top