Eine alternative Software wie VisualVM programmatisch zu finden Java-Anwendungen Werte usw. laufen durch Heapspeicherauszüge suchen?

StackOverflow https://stackoverflow.com/questions/2019624

Frage

Ich bin nicht mit Java-Anwendungen erlebt, aber ich fand heraus, dass die Suche nach statischen Zeigern usw. zu diesen Speicheradressen Anwendungen häufig ist (fast) unmöglich, offenbar wegen des Java-Engine, die den Code behandelt (korrigieren Sie mich, wenn diese Weise die Namensgebung ist es falsch, bitte).

Jetzt habe ich gebrauchte VisualVM ( https://visualvm.dev.java.net/), und es ist großartig. Ich kann meinen Java-Prozess auswählen und einen Heap Dump erstellen. Es zeigt mir, dann werden alle Klassen und deren Werte.

Kann ich diese Methode verwenden continousely die Heapdump abzufragen und Objektwerte, zum Beispiel die X-Y und Z eines Spiels erhalten? Wie würde ich programmatisch mit einer solchen Anwendung interagieren, und, wenn dies nicht mit VisualVM getan werden sollte, was wäre eine Alternative?

Edit: das ist, was ich tun muss: Ich muss in der Lage, alle Klassen mit Eigenschaften zu finden, die einen bestimmten Wert haben. Zum Beispiel: Ich würde für die X-Koordinate (a float) suchen und es soll die Klasse „PlayerCoordsHandler“ (nur ein Beispiel) und der entsprechende Schwimmer mit seinem Wert ... oder alternativ nur eine Möglichkeit, diesen gleichen Schwimmer wieder zurück zu finden (zum Beispiel nach dem Neustart). Dieser Prozess muss nicht programmatisch sein, aslong als den Wert der jetzt bekannten Eigenschaft (x float) Anfordern kann programmatisch abgerufen werden (zum Beispiel mit einer Kommandozeilen-Utility oder das Lesen aus einer Datei).

Edit2: Die Zielanwendung ist eine ausführbare Windows-Datei (aber gemacht mit Java) und startet seine eigenen Java-VM. Es ist nicht möglich, Java-Parameter für die Fehlersuche hinzuzufügen. Dies scheint allerdings nicht erforderlich, da VirtualVM der Lage ist, den Prozess zu debuggen gut. Jeder weiß, wie?

Vielen Dank im Voraus.

War es hilfreich?

Lösung

Es sieht aus wie Sie Java-Anwendungen laufen zu debuggen.

Die "offizielle" Java Debugger JDB. Ich glaube, es ist Teil des JDK ist. Es hat die Fähigkeit, Breakpoints zu setzen, untersuchen Haufen, Liste und Anzeige und sogar Variablen ändern, zeigen laufende Threads und so weiter. Das übliche Debugger Zeug. Aber es ist Befehlszeile, die es einen Schmerz im Nacken macht zu arbeiten.

Stattdessen macht es sehr viel Sinn mit integriertem Debugger eine IDE zu verwenden. Ich benutze Eclipse-. Sie können alle üblichen debuggery Dinge tun, einschließlich Fenster mit Variablen angezeigt werden. Sie können bedingte Haltepunkte festgelegt und es gibt viel mehr. Insbesondere in Antwort auf Ihre Frage, können Sie Uhr Ausdrücke einrichten, die während der Ausführung des Programms und ihre Displays aktualisiert mit neuen Werten ausgewertet werden, wenn sie sich ändern.

Sie können nicht wollen, um Ihre Java-Anwendung innerhalb der IDE auszuführen; oder es kann in einem Web Application Server ausgeführt werden. Das ist kein Problem für JDB oder Eclipse (oder einem anderen IDEs wie NetBeans oder IntelliJ Idea.): Sie zu einem laufenden JVM und Debug-Remote mit dem gleichen Maß an Komfort verbinden kann

Ein Programm wird wie folgt ausgetestet, remote oder sonst laufen etwas langsamer, als wenn sie es nicht waren. Ihr Spiel, während gedebuggt, läuft bei eher schlecht aussehenden FPS; aber es sollte noch mehr oder weniger reagieren normalerweise Interaktion Gameplay.


Remote Debugging:

  

Damit Sie Ihre befestigen Eclipse- NetBeans Debugger zu einem laufenden Java-Prozess müssen Sie diesen Prozess beginnen mit dem Java-Optionen folgenden ...

-Xdebug -Xrunjdwp:transport=dt_socket,address=3704,server=y,suspend=n

Andere Tipps

Hier finden Sie aktuelle YourKit . Sie können CPU, Speicher und Threads leben, überwachen und Dumps erzeugen, wann immer Sie wollen. Es kann sogar vergleichen verschiedene Speicherabbildern Ihnen zu zeigen, welche Objekte wurden hinzugefügt / entfernt werden.

Es ist zwar nicht kostenlos, es einen 15 Tage (oder 30 Tage?) Voll funktionsfähig eval Zeitraum. Wenn frei ist kein echtes Problem, es ist auf jeden Fall ein großes Werkzeug.

ich guter Ausgangspunkt ist die jps und jstat Tools in Java hinzugefügt 6 (glaube ich). jps gibt Ihnen die pid und Hauptklasse für jede Anwendung. jstat geben Ihnen mehr Details über den Prozess

Auslösen einen heapdump ist nützlich für die post-mortem-Analyse von Speicherlecks sagen, aber als die Java Garbage Collector Objekte in der Umgebung bewegt, können Sie nicht den Speicherwert eines heapdump verwenden, um zuverlässig diese Objekte zugreifen zu können.

Wenn Sie einen Weg müssen von außerhalb der Anwendung internen Werte abfragen Sie in den Aufbau eines RMI-Service-API aussehen könnte, über die Sie die Werte abrufen können Sie benötigen.

Eine andere Methode (wenn Sie nur etwas brauchen, zu testen) könnte an den Prozess über de Java Debug-API zu verbinden.

Wenn Sie die JRE Lage kennen, die verwendet wird, Sie java.exe umbenennen und schreiben konnte eine (C / C ++) Wrapper, der die Debug-Optionen aufgeführt von Carl fügt hinzu und ruft die renamed_java.exe wiederum.

könnten andere posibility in der .jar-Datei der Anwendung hinzuzufügen oder zu aktualisieren Klassen sein. Sie haben nicht die Quelle brauchen, dies zu tun.

Tom, versuchen Sie stornieren eine Anwendung zu entwickeln, die speziell ihre Arbeits zu verschleiern versucht? Wenn dies der Fall könnten Sie weiter, wenn Sie an den Hersteller wenden und sie bitten, welche Möglichkeiten sie sehen, für das, was Sie versuchen zu erreichen?

Sie können ganz einfach einen Heap Dump erzeugen, indem Sie Ihre eigene JMX-Verbindung zum JVM zu schaffen, so wie VisualVM es tut. die heapdump Die Analyse ist sehr gut möglich (die Daten sind und vollständig von der JVM getrennt, so dass keine Störung von der gc ist).

Allerdings, wenn es sich um ein sehr spezielles Szenario ist, dass Sie, die Sie suchen sind wahrscheinlich viel besser die heapdump auf MAT und einen guten Workflow zu verwenden, in dort finden.

Edit: In diesem speziellen Fall ist es wahrscheinlich besser, eine Art von spezifischer API erstellen, um die Werte von außen zugreifen (und vielleicht auch die Werten als MBeans mit JMX veröffentlichen). Einen Heapdump wird viel zu viel Arbeit, wenn alles, was Sie tun möchten, ist ein paar Werte zu überwachen.

Edit2: Auf der Basis Ihrer Änderungen, wie es mir scheint, wie Sie wirklich von der Veröffentlichung Ihrer eigenen MBean über JMX profitieren könnten. Ich habe für ein Treffen laufen, aber, es sei denn, jemand anders es tut, während ich weg bin, ich werde versuchen, sich daran zu erinnern Sie später einige Hinweise zu geben. Entweder in einer Bearbeitung von diesem oder in einem neuen Beitrag.

Wenn Sie die Werte bestimmter Objekte abfragen wollen, während die Java-Anwendung, die Sie ausgeführt würden wahrscheinlich feststellen, dass mit JMX ist eine bessere und effizientere Ansatz, anstatt einen Heapdump verwenden. Mit JMX können Sie festlegen, welche Werte ausgesetzt und benutzen Werkzeuge wie VisualVM oder JConsole sollte sie zur Laufzeit anzuzeigen.

Mit VisualVM und heapdump Sie alle Klassen mit bestimmten Eigenschaft von OQL finden:

var out = "";
var cls = filter(heap.classes(), "/java./(it.name)")

while (cls.hasNext()) {
  var cl = cls.next();
  var fls = cl.fields;
  while (fls.hasMoreElements()) {
    var fl = fls.nextElement();
    if (/size/(fl.name)) {
      out = toHtml(cl) + "." + fl.name + "()\n";
    }
  }
}

out.toString()

und Schreib benutzerdefinierte Protokollierung für BTRACE

Es ist Alternative für das Debuggen.

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