studio móviles interfaz interfaces grafico graficas grafica desarrollo curso codigo aplicaciones java static-code-analysis call-graph

móviles - java grafico



Creación de un gráfico de llamadas visual para proyectos java desde la línea de comandos (2)

Estoy buscando crear un gráfico de llamadas para proyectos Java desde la línea de comandos. He explorado varios proyectos, cada vez fallando (ya sea en mi entendimiento o en la funcionalidad) de lo que estoy buscando. Algunas pautas simples sobre cómo hacer esto serían excelentes, un objetivo adicional es obtener una representación de texto de este gráfico.

Esto es lo que he intentado:

Call-graph: https://github.com/gousiosg/java-callgraph

Esto me da el resultado de texto que quiero, pero no puedo encontrar una forma (después de revisar la documentación durante algún tiempo), para convertir esto en un resultado gráfico (archivo de imagen).

Hollín: http://sable.github.io/soot/

Después de pasar una gran cantidad de tiempo revisando la documentación de SOOT, que parece bastante difícil de seguir, logré que SOOT creara un código de bytes. Sin embargo, no puedo encontrar ninguna guía sobre cómo crear un gráfico de llamadas a partir de él. Solo veo en la página principal que puede hacer esto, y recibo varias conversaciones de correo electrónico de mis búsquedas en Google, todas las cuales son solo preguntas sin respuestas. Estoy usando la construcción nocturna con el comando:

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

Donde HelloWorld es el nombre de mi archivo java, obtengo una salida que es un archivo .class, pero no puedo ver cómo obtener el gráfico de la llamada real. Esto es después de seguir la guía aquí: https://github.com/Sable/soot/wiki/Running-Soot . Cuando sigo enlaces sobre visualizaciones, parecen ser enlaces rotos que luego redireccionan a la página de inicio. Puedo ver algo de información sobre el uso del indicador -cg en la página de la línea de comandos, pero no puedo hacer que funcione. Solo obtengo un error de análisis de opciones, lo que sugiere un argumento no válido: https://ssebuild.cased.de/nightly/soot/doc/soot_options.htm#phase_5

Buscando stackoverflow: respuestas existentes Ya he examinado varias preguntas similares, como: Análisis estático del gráfico de llamadas de Java Sin embargo, las respuestas solo dicen "usar hollín" o "usar el gráfico de llamadas", he estado probando esto sin suerte - aunque estoy más cerca con el gráfico de llamadas ya que tengo la salida de texto.

Veo un software basado en GUI y complementos de eclipse que pretenden crear gráficos de llamadas, pero estoy tratando de que esto funcione desde la línea de comandos.

Cualquier ayuda es realmente apreciada, una guía o un conjunto de comandos con call-graph o Soot, u otro programa realmente podría ayudar. También puede valer la pena devolverles un breve tutorial para su documentación, ya que parece haber más preguntas. que respuestas al buscar.

Para referencia, actualmente estoy intentando con una clase muy simple a continuación:

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


Parece que Call Graph produce una salida bastante decente. Vamos a hacer un rápido PoC.

Usaré una salida de muestra proporcionada por el desarrollador de 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

Hay varios motores de renderizado de gráficos disponibles. Lo más sencillo posible es DOT (verifique el enlace, hay varias otras buenas herramientas en la lista).

Para usar DOT necesitaré transformar un poco los datos. Digamos que me gustaría mantener ClassName: methodName y omitir el paquete.

Es muy fácil, puedes usar cualquier herramienta para hacer eso, pero sed :

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

Aquí se genera el resultado:

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 fue bastante amable de convertir eso en lo siguiente:

Todos los gráficos fueron extraídos de los datos iniciales:

Tenga en cuenta que puede ajustar la representación como desee. DOT es una parte de graphviz que es un conjunto bastante flexible de herramientas.

Hay una idea general detrás de mi respuesta:

  • Utilizar cualquier herramienta adecuada para generar trazas.
  • encontrar una buena solución de representación
  • Pasa un poco de tiempo para obtener una conversión automatizada simple

Por cierto, eche un vistazo a canviz

Canviz es una biblioteca de JavaScript para dibujar gráficos de Graphviz en el lienzo de un navegador web. Más técnicamente, Canviz es un procesador de JavaScript xdot. Funciona en la mayoría de los navegadores modernos.

Feliz codificacion :)


También está WALA: http://wala.sourceforge.net/wiki/index.php/Main_Page

Es compatible con varias estrategias de creación de gráficos de llamadas y ya tiene integración con DOT. Si sigue la guía de inicio, ya contienen una serie de programas de ejemplo que muestran visualmente el gráfico de llamadas. Su lista de usuarios también es bastante de apoyo.

Aquí mencionan un ejemplo que muestra el gráfico de llamadas:

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