2010-01-29 11 views
19

¿Existe alguna herramienta no juguetona que pueda crear un gráfico de llamadas de toda la aplicación? No me refiero solo a obtener una imagen o dibujar un gráfico de llamadas por medio de señalar método por método.Gráfico de llamada de toda la aplicación

Necesito un gráfico de llamadas, que se puede acceder mediante programación, es decir, la herramienta debe descargarlo a un archivo en modo texto (por ejemplo, XML) o crear el gráfico de llamadas en memoria (lo que resulta problemático para aplicaciones grandes). Un gráfico de llamadas construido en una base de datos sería genial.

Tanto los gráficos de llamada estáticos como los dinámicos están en demanda; aunque uno estático es un poco más interesante, el hecho de que sea demasiado aproximado es aceptable.

He probado hollín hasta ahora. Sin embargo, no es capaz de manejar incluso proyectos de tamaño mediano como FreeCol (hay fuentes de Java disponibles). El hollín consume 1.5GB de memoria en ese proyecto y luego JVM se cuelga, como se describe aquí: http://www.sable.mcgill.ca/pipermail/soot-list/2008-July/001828.html

¿Alguien podría sugerir una herramienta para generar un gráfico de llamadas, como se describió anteriormente? Los lenguajes Java o .NET están bien.

Saludos, Sarge

+4

Tome el martillo y use una plataforma de 64 bits y asigne unos 6 GB o lo que sea a la JVM para Soot ...;) – Lucero

+0

¿Desea un gráfico de llamadas construido para Java? Para C? para ...? Supongo que Java, pero su referencia a C# pone en duda esta suposición. –

+0

Lucero, gracias. Por cierto, ¿JVM puede manejar más de 2 GB de RAM? De todos modos, aunque esta solución me puede permitir crear un gráfico de llamadas para FreeCol, pero para un proyecto grande (por ejemplo, Alfresco) requerirá 100 GB de RAM, etc. Esa no es la manera correcta. –

Respuesta

2

Sarge,

JProfiler es un perfilador de Java decente que generará el gráfico de llamadas, así como le permite exportar en formato XML.

No he usado el hollín, así que no puedo comentar cómo se compara JProfiler con el hollín, pero espero que JProfiler requiera 2.5-3 veces la memoria en comparación con la aplicación.

+2

Un analizador dinámico solo puede construir la parte del gráfico de llamadas que realmente se recorre durante la ejecución. Para obtener un gráfico semi-completo, debe ejercitar el sistema bastante bien, y dado que la mayoría de los bancos de pruebas solo llegan al 70-80%, habrá un número bastante grande de llamadas que simplemente no están enumeradas. Un análisis dinámico da una "subestimación". Un analizador estático (ver mi respuesta) calcula el gráfico de llamadas inspeccionando el código. Como cualquier análisis seguro debe ser conservador, un analizador estático da una "sobreestimación", pero no pierde ninguna llamada potencial. –

+0

OP dijo que también estaría interesado en las herramientas de generación dinámica de gráficos de llamadas, pero su punto está bien hecho. – jbranchaud

7

Nuestra DMS Software Reengineering Toolkit puede construir gráficos de llamadas globales de C, Java y COBOL. Estos se calculan como una estructura de datos en memoria, y luego se pueden recorrer para recopilar otros datos arbitrarios. (Podría exportarlo a alguna otra herramienta para recorrerlo, pero para un gran gráfico de llamadas, el tiempo y el esfuerzo para exportar dominarían el tiempo para analizarlo, por lo que tendemos a no exportarlo. YMMV).

Es relativamente fácil extraer información de call-graph de una declaración de la forma abstracta de "CALL X (...)", porque la X objetivo está justo allí en el código en el sitio de la llamada. Las llamadas indirectas (llamadas virtuales o de método) son problemáticas en el sentido de que los objetivos reales de las llamadas no están triviales en el código en el sitio de llamadas, sino que de hecho están diseminados por todo el sistema y, lo que es peor, controlados por condiciones de tiempo de ejecución. En ausencia de información adicional, un constructor de gráfico de llamadas tiene que asumir que una llamada indirecta puede dirigirse a cualquier objetivo con una firma coincidente; esto introduce muchos arcos de llamada falsos positivos en el gráfico.

DMS utiliza un (conservadores) puntos-a Global análisis como parte del proceso de extracción gráfico de llamadas, para determinar donde tales llamadas indirectas van, y reducir al mínimo los falsos positivos. Consulte Flow analysis and call graphs para obtener más ejemplos de lo que DMS puede extraer, y un gráfico de muestra extraído de un sistema de 250,000 funciones.

+0

Ira, el conjunto de herramientas anterior me proporcionaría un gráfico de flujo de control, ¿correcto? ¿También proporciona un gráfico de dependencia del procedimiento, de manera similar a grammatech? (http://www.grammatech.com/research/papers/slicing/slicingWhitepaper.html) – Joeblackdev

+0

No proporciona un PDG per se. Proporciona cadenas de uso def, un flujograma de control total por método/función y un gráfico de llamadas global. Su interés está aparentemente en rebanar Java (determinado a partir de otras interacciones SO); hay suficiente allí para cortar Java (usamos la misma información para cortar C y COBOL). –

+0

¿Esta herramienta está disponible gratuitamente? ¿O es un producto comercial? – Joeblackdev

1

Salida http://semmle.com/

he utilizado su herramienta cuando estaba en fase beta. Construye una base de datos de información de programa que puede consultar mediante programación. La compañía es una startup y el producto ya no está en versión beta, aunque no puedo encontrar en ningún sitio de su sitio cómo comprarlo ni cuánto cuesta.

NDepend (http://www.ndepend.com/) es una herramienta similar para .NET que también he usado, pero no estoy seguro de si se puede acceder a ella programáticamente.XDepend (http://www.xdepend.com/) es su herramienta para Java, que no he usado.

1

1.5 GB no es mucha memoria para gráficos de llamadas realistas. Supongo que el hollín te da lo que estás pidiendo. Los gráficos de llamada de otras herramientas pueden ser más pequeños, pero es probable que estén incompletos.

+0

Hemos creado gráficos de llamadas razonablemente precisos (usando el análisis de punteros para indicadores de función) para un sistema con 26,000 unidades de compilación, 250,000 funciones en un espacio de direcciones de 32 bits. Eso me parece bastante realista. El análisis * points-to * requirió 95 Gigabytes VM. (Sí, GB). –

Cuestiones relacionadas