Eine alternative software wie VisualVM programmgesteuert zu finden, die die Ausführung von java-Anwendungen' - Werte usw. durch die Suche heap-dumps?
Ich bin nicht erfahren mit java-Anwendungen, aber ich fand heraus, dass die Suche nach statischen Zeiger etc. zu diesen Anwendungen die Speicher-Adressen ist oft (fast) unmöglich, wahrscheinlich, weil die java-engine verarbeitet der code (korrigiert mich, wenn diese Art der Benennung, dass es falsch ist, bitte).
Nun, ich habe VisualVM (https://visualvm.dev.java.net/) und es ist toll. Ich kann wählen, meine java-Prozess, und erstellen Sie ein heap-dump. Dann zeigt mir alle Klassen und Ihre Werte.
Kann ich diese Methode verwenden, um continousely Umfrage der heap-dump empfangen und Objekt-Werte, zum Beispiel die X-Y-und Z-für ein Spiel? Wie würde ich die programmgesteuerte Interaktion mit der Anwendung und wenn dies nicht getan werden sollte mit VisualVM, was wäre eine alternative?
Edit: dies ist, was ich tun muss:
Ich muss in der Lage sein, alle Klassen mit Eigenschaften, die einen bestimmten Wert haben. Zum Beispiel: ich Suche für die X-Koordinate (float) und sollte es wieder der Klasse "PlayerCoordsHandler" (nur ein Beispiel) und die entsprechenden float mit dem Wert... oder alternativ einfach einen Weg zu finden, diese gleichen Schwimmer wieder (nach Neustart z.B.). Dieser Prozess muss nicht programmatisch, sofern die Beantragung der Wert der jetzt bekannten Eigenschaft (float x) abgerufen werden können programmgesteuert (zum Beispiel mit einem Befehlszeilen-Dienstprogramm oder das Lesen aus einer Datei).
Edit2:
Die Ziel-Anwendung ist eine ausführbare windows-Datei (machte aber mit java) und bringt seine eigene java-VM. Es ist nicht möglich, java-Parameter für die Fehlersuche. Dies scheint nicht erforderlich zu sein, obwohl, wie VirtualVM ist in der Lage, um das Debuggen der Vorgang einwandfrei. Weiß jemand wie?
Vielen Dank im Voraus.
- Das ist verrückt, die Leute Lesen "VisualVM" und Sie springt einfach mit Ihrem YourKit, MATTE, meins ist besser als deins, usw., ohne die Beantwortung der eigentlichen Frage. Tom, konnte Sie klären, was Sie versuchen zu tun, ich glaube nicht wirklich, dass die Erzeugung von heap-dumps ist der Weg zu gehen.
- Meine Erwähnung der MATTE war nur eine generische alternative wie Sie sehen können, mich und ein paar andere auch schlägt vor, dass Tom schafft eine MBean oder etwas, wo er kann entweder veröffentlichen die Werte als Attribute oder eine operation zu suchen, die bestimmte Werte, wenn das praktischer ist. Was ist so toll daran? Eine alternative könnte natürlich sein, nicht zu verwenden, JMX, aber einige andere Schnittstelle, das gleiche zu tun, aber dann Tom schreiben, eine Menge Dinge, JMX, kümmert sich sowieso. Er fragte nach alternativen für eine sehr vage brauchen, und er bekam Sie. Nichts verrückt mit diesem.
- Alle Antworten bisher waren mehr als hilfreich!!! Ich verstehe, dass meine Frage vielleicht ganz vage, aber für jemanden unerfahrenen mit allen Bedingungen in diesem Bereich, dies ist das beste, das ich tun kann.
- Ist es eine Reihe von gut definierten Parameter, die Sie wollen, zu betrachten oder etwas komplexer?
- Ich aktualisiert meine Frage mit einem Beispiel, was ich tun muss. Ich denke, es ist eine gut definierte parameter (?)
- Ich bearbeitet meine post leicht. ALSO nicht über eine sehr gute PM-Funktion, aber wenn ich vergesse, es zu verlängern mehr, bitte Kommentar posten, um mich daran zu erinnern.
- Danke, ich kommentierte Ihren post.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sieht es aus wie Sie wollen, Debuggen, ausführen von Java-Anwendungen.
Die "offizielle" Java-debugger JDB. Ich glaube, es ist ein Teil des JDK. Es hat die Fähigkeit, breakpoints zu setzen, untersuchen, Haufen, Liste und anzeigen und sogar Variablen zu ändern, zeigen die Laufenden threads und so weiter. Die üblichen debugger-Kram. Aber es ist Befehl-Linie, die macht es ein Schmerz im Nacken, mit zu arbeiten.
Statt, es macht eine Menge Sinn, eine IDE mit integriertem debugger. Ich benutze Eclipse. Sie können alles tun, die üblichen debuggery Dinge, einschließlich der Anzeige von windows, die mit Variablen. Sie können bedingte breakpoints gesetzt und es gibt viel mehr. Speziell um deine Frage zu beantworten, können Sie festlegen, watch-Ausdrücke, die ausgewertet werden, während die Ausführung des Programms und Ihre Anzeige aktualisiert, mit neuen Werten, wenn Sie sich ändern.
Können Sie nicht wollen, laufen deine Java-Anwendung innerhalb der IDE, oder es kann ausgeführt werden in einem Web application server. Das ist kein problem für JDB oder Eclipse (oder eine andere IDEs wie NetBeans oder IntelliJ Idea): Sie können eine Verbindung zu einer Laufenden JVM und Debuggen aus der Ferne mit dem gleichen Komfort.
Programm gedebuggt wird, wie diese, aus der Ferne oder sonst etwas langsamer, als wenn Sie es nicht waren. Ihr Spiel, während die gedebuggt wird, wird laufen eher schlecht aussehenden FPS, aber es sollte noch reagieren mehr oder weniger normal, gameplay, Interaktion.
Remote-debugging auszuführen:
java
aus dem classpath und ersetzen Sie es mit einemjava.cmd
oderjava.bat
fordert, dass die Reale mit der gewünschten Optionen. Aber wenn, die nicht arbeiten, ich fürchte, es wäre Zeit zu geben, sich auf diesen Ansatz. 🙁java.exe
undjavaw.exe
vom system WEG (konnte Sie nur umbenennen, wenn Sie wollen, werden brutal) und setzen Sie einjava.CMD
undjavaw.CMD
Datei auf den Pfad aufrufen, werden die umbenannte javaexe
s unter dem neuen Namen. Wenn Sie können, dass die Arbeit, die Sie haben Java durch den Schwanz. Ich halte beide erwähnen java.exe und javaw.exe Ursache könnte Ihre app verwenden, entweder. Javaw ist in der Regel für GUI-Anwendungen.Haben Sie einen Blick auf YourKit. Sie können überwachen, CPU, memory und threads, die Leben, und dumps generieren, Wann immer Sie wollen. Es können auch Vergleiche zwischen verschiedenen Speicher-dumps, Ihnen zu zeigen, welche Objekte wurden Hinzugefügt/entfernt.
Es ist nicht frei, obwohl, hat es eine 15-Tage (oder 30 Tage?) voll funktionsfähig eval-Zeitraum. Wenn free ist nicht eine echte Sorge es ist definitiv ein großartiges Werkzeug.
Ich guter Ausgangspunkt ist die
jps
undjstat
tools Hinzugefügt, die in Java 6 (glaube ich).jps
gibt Ihnen die pid und der main-Klasse für jede Anwendung.jstat
Ihnen mehr details über den ProzessAuslösung eines heapdump ist nützlich für die post-mortem-Analyse sagen, dass es memory leaks, aber als die Java garbage collector verschiebt Objekte um Sie nicht den Speicher verwenden, der Werte eines heapdump zuverlässig Zugriff auf diese Objekte.
Wenn Sie benötigen eine Möglichkeit, die Abfrage interner Werte von außerhalb der Anwendung, die Sie schauen konnten, in der Einrichtung eines RMI-service-API, über die Sie abrufen können, die Werte, die Sie benötigen.Andere Methode (wenn man nur etwas testen) könnte die Verbindung zu den Prozess über de Java debugging-API.
Wenn Sie wissen, die JRE-Speicherort, den Sie umbenennen könnte java.exe und schreiben (C/C++) - wrapper fügt hinzu, dass die debug-Optionen aufgeführt, die von Carl und fordert die renamed_java.exe wiederum.
Andere Möglichkeit könnte sein, zum hinzufügen oder aktualisieren von Klassen in der
.jar
- Datei der Anwendung. Sie brauchen nicht die Quelle, dies zu tun.Tom, sind Sie versuchen, reverse Engineering für eine Anwendung, die speziell versucht zu verschleiern seine Arbeit? Wenn ja, könnten Sie weiterkommen, wenn Sie den Hersteller Kontaktieren und Fragen Sie, welche Möglichkeiten Sie sehen, was Sie versuchen zu erreichen?
Können Sie ganz einfach erzeugen einen heap-dump, indem Sie Ihre eigenen JMX-Verbindung zu der JVM, wie VisualVM funktioniert es. Die Analyse der heapdump ist sehr gut möglich (die Daten vorhanden und vollständig getrennt von der JVM, so dass es keine Störungen von der gc).
Jedoch, es sei denn, es ist ein sehr spezifischen Szenario, die Sie suchen, sind Sie wahrscheinlich viel besser dran, was dem heapdump zu MAT und finden einen guten workflow in dort zu verwenden.
Edit: In diesem speziellen Fall ist es wohl besser, eine Art von spezifischen API zum Zugriff auf die Werte von außen (und vielleicht auch die Werte zu veröffentlichen, die als MBeans verwenden der JMX). Unter einem heap-dump ist viel zu viel Arbeit, wenn alles, was Sie tun möchten, ist die überwachung ein paar Werte.
Edit2: Basierend auf Ihren änderungen, es scheint mir, wie Sie konnte wirklich profitieren von der Veröffentlichung Ihrer eigenen MBean über JMX. Ich habe zu laufen für ein treffen, aber, es sei denn, jemand anderes tut es, während ich Weg bin, ich werde versuchen zu erinnern, um Ihnen einige Hinweise später. Entweder in ein edit von diesem oder in einem neuen post.
Wenn Sie wollen, um Abfragen der Werte bestimmter Objekte, während Ihre Java-Anwendung ausgeführt wird, würden Sie wahrscheinlich feststellen, dass die Verwendung JMX ist eine bessere und effizientere Ansatz, anstatt einen heap-dump. Mit JMX können Sie definieren, welche Werte sollte ausgesetzt werden, und verwenden Sie tools wie VisualVM oder JConsole zur Ansicht zur Laufzeit.
Mit VisualVM und heapdump finden Sie alle Klassen mit einer bestimmten Eigenschaft von OQL:
schreiben und benutzerdefinierte Protokollierung für BTrace
Es ist die alternative für die Fehlersuche.