Un'alternativa di software come VisualVM per trovare a livello di codice in esecuzione valori applicazioni Java, ecc con la ricerca discariche mucchio?

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

Domanda

Non ho sperimentato con le applicazioni Java, ma ho scoperto che trovare puntatori statici ecc per gli indirizzi di memoria queste applicazioni è spesso (quasi) impossibile, a quanto pare a causa del motore Java che gestisce il codice (correggetemi se in questo modo di nominare è sbagliato per favore).

Ora, ho usato VisualVM ( https://visualvm.dev.java.net/) ed è grande. Posso selezionare il mio processo di Java e creare un heap dump. E poi mi ha tutte le classi ed i loro valori mostra.

È possibile utilizzare questo metodo per il polling continousely l'heap dump e ricevere i valori degli oggetti, ad esempio, la X Y e Z di un gioco? Come faccio a interagire a livello di codice con tale applicazione, e se questo non dovrebbe essere fatto con VisualVM, quello che sarebbe un alternativa?

Modifica: questo è quello che devo fare: Ho bisogno di essere in grado di trovare tutte le classi con le proprietà che hanno un certo valore. Per esempio: mi piacerebbe cercare la coordinata X (un galleggiante) e deve restituire la classe "PlayerCoordsHandler" (solo un esempio) e il galleggiante corrispondente con il suo valore ... o, in alternativa solo un modo per ritrovare la stessa galleggiante (dopo il riavvio, per esempio). Questo processo non deve essere programmatico, aslong come richiede il valore della proprietà oggi nota (x float) può essere recuperato a livello di programmazione (ad esempio con una linea di comando o la lettura da un file).

Edit2: L'applicazione di destinazione è un eseguibile di Windows (ma fatto con Java) e lancia un proprio Java VM. Non è possibile aggiungere i parametri java per il debug. Questo non sembra essere necessario se, come VirtualVM è in grado di eseguire il debug del processo di bene. Qualcuno sa come?

Grazie in anticipo.

È stato utile?

Soluzione

Sembra che si desidera eseguire il debug eseguire applicazioni Java.

Il debugger "ufficiale" Java è JDB. Credo che sia parte del JDK. Esso ha la possibilità di impostare i punti di interruzione, esaminare cumuli, elenco e visualizzazione e anche cambiare variabili, mostra fili conduttori e così via. La roba debugger solito. Ma è da riga di comando, che lo rende un dolore al collo con cui lavorare.

Invece, si fa un sacco di senso usare un IDE con debugger integrato. Io uso Eclipse. Si può fare tutte le solite cose debuggery, tra cui la visualizzazione di finestre con le variabili. È possibile impostare punti di interruzione condizionali e non c'è molto altro. In particolare in risposta alla tua domanda, è possibile impostare espressioni di controllo, che sarà valutato durante l'esecuzione del programma e le loro esposizioni aggiornati con i nuovi valori quando cambiano.

Non si può decidere di eseguire la vostra applicazione Java all'interno dell'IDE; o può essere in esecuzione in un server di applicazioni Web. Questo è un problema per JDB o Eclipse (o altri IDE, come NetBeans o IntelliJ IDEA):. Possono connettersi a una JVM in esecuzione ed eseguire il debug remoto con lo stesso livello di convenienza

Un programma in fase di debug come questo, in remoto o in altro modo, correre un po 'più lentamente di quanto se non fosse. Il vostro gioco, mentre in fase di debug, funzionerà a piuttosto cattivo cercando FPS; ma dovrebbe ancora rispondere più o meno normalmente al gameplay interazione.


Il debug remoto:

  

Per essere in grado di collegare il Eclipse NetBeans debugger a un processo in esecuzione Java è necessario iniziare quel processo con le seguenti opzioni Java ...

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

Altri suggerimenti

Dai un'occhiata alla YourKit . È possibile monitorare CPU, memoria e fili vivere, e generare discariche ogni volta che vuoi. Si può anche confrontare memoria diversa discariche visualizzare cui sono stati aggiunti / rimossi oggetti.

Non è gratuito, però, ha un 15 giorni (o 30 giorni?) Periodo eval pienamente funzionale. Se libero non è una preoccupazione reale è sicuramente un ottimo strumento.

I buon punto di partenza è il jps e jstat strumenti aggiunti in Java 6 (credo). jps ti dà la classe pid e principale per ogni applicazione. jstat darvi maggiori dettagli su processo

Attivazione di un heapDump è utile per l'analisi post-mortem di dire perdite di memoria, ma come il garbage collector di Java si muove oggetti intorno, non è possibile utilizzare i valori della memoria di un heapDump per accedere in modo affidabile gli oggetti.

Se avete bisogno di un modo per interrogare i valori interni al di fuori dell'applicazione che si poteva guardare nella creazione di un servizio di API RMI tramite il quale è possibile recuperare i valori necessari.

Un altro metodo (se avete solo bisogno di testare qualcosa) potrebbe essere quello di collegarsi al processo di via de Java API di debug.

Se si conosce il percorso JRE che viene utilizzata, si potrebbe rinominare java.exe e scrivere un wrapper (C / C ++) che aggiunge le opzioni di debug elencati da Carl e chiama il renamed_java.exe a sua volta.

Un altro possibilita 'potrebbe essere quella di aggiungere o aggiornare le classi nel file .jar dell'applicazione. Non è necessario la fonte di fare questo.

Tom, stai cercando di decodificare un'applicazione che tenta di offuscare il suo funzionamento? Se è così si potrebbe ottenere di più se si contatta il produttore e chiedere loro quali possibilità che vedono per quello che si cerca di raggiungere?

Si può facilmente generare un heap dump creando un collegamento JMX alla JVM, proprio come VisualVM lo fa. Analizzando il heapDump è molto possibile (i dati sono lì e completamente scollegato dalla JVM quindi non c'è alcuna interferenza dal gc).

Tuttavia, a meno che non si tratta di uno scenario molto specifico che si sta cercando si sono probabilmente molto meglio dando la heapDump a MAT e trovare un buon flusso di lavoro in là da usare.

Modifica In questo caso particolare è probabilmente meglio per creare una sorta di specifica API per accedere ai valori dall'esterno (e magari pubblicare i valori come MBeans utilizzando JMX). Prendendo un heap dump è modo di molto lavoro, se tutto quello che vogliamo fare è il monitoraggio alcuni valori.

Edit2: Sulla base le modifiche, mi sembra come si potrebbe davvero beneficiare di pubblicare il proprio MBean JMX sopra. Devo correre per un incontro, ma, a meno che qualcun altro lo fa durante la mia assenza, cercherò di ricordarsi di darvi alcune indicazioni tardi. Sia in una modifica di quest'ultimo o in un nuovo post.

Se si vuole interrogare i valori degli oggetti specifici mentre l'applicazione Java si è in esecuzione probabilmente trovare che l'uso di JMX è un approccio migliore e più efficiente piuttosto che utilizzare un heap dump. Con JMX è possibile definire quali valori dovrebbero essere esposti e utilizzare strumenti come VisualVM o JConsole per visualizzarle in fase di esecuzione.

Con VisualVM e heapDump si possono trovare tutte le classi con certa proprietà da OQL:

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()

e scrivere su misura registrazione per BTrace

E 'un'alternativa per il debug.

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