2015-01-21 15 views
16

Sto cercando di creare un callgraph per i progetti java dalla riga di comando. Ho esplorato diversi progetti, ogni volta che non riesco a capire (né a mio avviso né a livello di funzionalità) ciò che sto cercando. Alcune semplici linee guida su come fare questo sarebbe grandioso, un ulteriore obiettivo è ottenere una rappresentazione testuale di questo grafico.Creazione di un grafico di chiamata visiva per i progetti java dalla riga di comando

Ecco che cosa ho provato:

Chiamata-grafico: https://github.com/gousiosg/java-callgraph

Questo mi dà l'output di testo che voglio, ma non riesco a trovare un modo (dopo aver guardato attraverso la documentazione per qualche tempo), per trasformarlo in un output grafico (file immagine).

Fuliggine: http://sable.github.io/soot/

Dopo aver trascorso una quantità enorme di tempo a guardare attraverso la documentazione fuliggine, che sembra piuttosto difficile da seguire, sono riuscito ad ottenere SOOT per creare bytecode. Tuttavia, non riesco a trovare alcuna guida su come creare un grafico di chiamata da esso. Vedo solo sulla pagina principale che è può fare, e ottengo diverse conversazioni via email dalle mie ricerche su google, tutte che sono solo domande senza risposte. Sto utilizzando la nightly build con il comando:

java -cp soot-trunk.jar soot.Main -cp . -pp HelloWorld 

Dove HelloWorld è il nome del mio file java, ottengo un output che è un file .class, ma non riesco a vedere come arrivare l'attuale call graph. Questo è dopo aver seguito la guida qui: https://github.com/Sable/soot/wiki/Running-Soot. Quando seguo i link relativi alle visualizzazioni, sembrano essere collegamenti interrotti che poi reindirizzano verso la home page. Posso vedere alcune informazioni sull'utilizzo della bandierina -CG sulla pagina riga di comando, ma non può ottenere nulla per il lavoro - ho solo un errore di parsing opzione, suggerendo un argomento non valido: https://ssebuild.cased.de/nightly/soot/doc/soot_options.htm#phase_5

Searching StackOverflow - le risposte esistenti Ho già esaminato diverse domande simili, come ad esempio: Static analysis of Java call graph Tuttavia, le risposte dicono "usa fuliggine" o "usa call-graph", ci ho provato senza fortuna, anche se sono più vicino call graph come ho l'output del testo.

Vedo alcuni software basati su GUI e plugin di eclipse che pretendono di creare call-graphs, ma sto cercando di farlo funzionare dalla riga di comando.

Qualsiasi aiuto è molto apprezzato, una guida o un insieme di comandi con call-graph o fuliggine, o un altro programma sarebbe davvero d'aiuto. Potrebbe valere la pena anche riprendere qualche breve tutorial per la loro documentazione come sembra essere più domande che risposte durante la ricerca.

Per riferimento, Attualmente sto tentando con una semplice classe di seguito:

public class HelloWorld { 

    public static void main(String[] args) { 
     foo(); 
    } 
    public static void foo(){ 
     System.out.println("Hello World"); 
    } 
} 

risposta

11

lo fa apparire come chiamata grafico produce un'uscita abbastanza decente. Facciamo un rapido PoC.

Utilizzerò un output di esempio fornito dallo sviluppatore di Call Graph.

 
org.apache.batik.dom.AbstractParentNode:appendChild org.apache.batik.dom.AbstractParentNode:fireDOMNodeInsertedEvent 6270 
org.apache.batik.dom.AbstractParentNode:fireDOMNodeInsertedEvent org.apache.batik.dom.AbstractDocument:getEventsEnabled 6280 
org.apache.batik.dom.AbstractParentNode:checkAndRemove org.apache.batik.dom.AbstractNode:getOwnerDocument 6280 
org.apache.batik.dom.util.DoublyIndexedTable:put org.apache.batik.dom.util.DoublyIndexedTable$Entry:DoublyIndexedTable$Entry 6682 
org.apache.batik.dom.util.DoublyIndexedTable:put org.apache.batik.dom.util.DoublyIndexedTable:hashCode 6693 
org.apache.batik.dom.AbstractElement:invalidateElementsByTagName org.apache.batik.dom.AbstractElement:getNodeType 7198 
org.apache.batik.dom.AbstractElement:invalidateElementsByTagName org.apache.batik.dom.AbstractDocument:getElementsByTagName 14396 
org.apache.batik.dom.AbstractElement:invalidateElementsByTagName org.apache.batik.dom.AbstractDocument:getElementsByTagNameNS 28792 

Sono disponibili diversi motori di rendering grafico.Il più semplice possibile è DOT (si prega di controllare il link, ci sono molti altri buoni strumenti elencati).

Per utilizzare DOT ho bisogno di trasformare i dati un po '. Diciamo che vorrei mantenere ClassName: methodName e saltare il pacchetto.

E 'super facile, è possibile utilizzare qualsiasi strumento per farlo, ma io uso sed: risultato

 
OUT=callgraph.dot 
echo "graph test {" > $OUT 
sed -E 's/[a-z]+\.//g; s/[0-9]+\/;/; s//-- /; s/[\$|\:]/_/g' callgraph.txt >> $OUT 
echo "}" >> $OUT 
dot -Tpng callgraph.dot -o callgraph.png 

Qui viene generato:

 
graph test { 
AbstractParentNode_appendChild -- AbstractParentNode_fireDOMNodeInsertedEvent ; 
AbstractParentNode_fireDOMNodeInsertedEvent -- AbstractDocument_getEventsEnabled ; 
AbstractParentNode_checkAndRemove -- AbstractNode_getOwnerDocument ; 
DoublyIndexedTable_put -- DoublyIndexedTable_Entry_DoublyIndexedTable_Entry ; 
DoublyIndexedTable_put -- DoublyIndexedTable_hashCode ; 
AbstractElement_invalidateElementsByTagName -- AbstractElement_getNodeType ; 
AbstractElement_invalidateElementsByTagName -- AbstractDocument_getElementsByTagName ; 
AbstractElement_invalidateElementsByTagName -- AbstractDocument_getElementsByTagNameNS ; 
} 

DOT era abbastanza gentile da rendere che nel seguito:

Tutti i grafici sono stati estratti dai dati iniziali:

enter image description here

Si prega di notare, è possibile il rendering regolare come si desidera. DOT è una parte di graphviz che è piuttosto un set flessibile di strumenti.

C'è un'idea generale dietro la mia risposta:

  • uso qualunque strumento idoneo a generare traccia
  • trovare una soluzione buona resa
  • trascorrere qualche ora al fine di ottenere semplice conversione automatica

proposito, dare un'occhiata a canviz

Canviz è una libreria JavaScript per disegnare grafici Graphviz su una tela del browser web . Più tecnicamente, Canviz è un riproduttore JavaScript xdot . Funziona nella maggior parte dei browser moderni.

Felice di codifica :)

+0

Grazie! Anche se non ho ancora avuto un momento per provare questo, sembra esattamente quello che sto cercando. Questa risposta aiuterà senza dubbio anche le persone future che vedono questa domanda poiché è ben spiegata. Grazie molto. – ThePerson

1

C'è anche WALA: http://wala.sourceforge.net/wiki/index.php/Main_Page

Supporta diversi call costruzione di strategie grafico e ha già l'integrazione con DOT. Se segui la guida introduttiva, contengono già un certo numero di programmi di esempio che visualizzano visivamente il grafico delle chiamate. Anche la loro lista di utenti è abbastanza favorevole.

Qui citare un esempio che visualizza il grafo delle chiamate:

http://wala.sourceforge.net/wiki/index.php/UserGuide:Getting_Started#Other_basic_examples

Problemi correlati