2009-02-05 22 views
80

Tengo un gran espacio de trabajo que tiene muchos archivos fuente de código C. Aunque puedo ver las funciones llamadas desde una función en MS VS2005 usando el navegador de Objetos, y también en MSVC 6.0, esto solo muestra funciones llamadas desde una función particular en un tipo de visualización no gráfica. Además, no muestra la función llamada a partir de decir main(), y luego las funciones llamadas desde él, y así sucesivamente, más adentro de la función de nivel de hoja.Herramientas para obtener una función gráfica llamada gráfica del código

Necesito una herramienta que me dará una gráfica llamada a la función pictóricamente con funciones callee y caller conectados por flechas o algo por el estilo, a partir de main() al último nivel de la función, o al menos mostrar un gráfico de llamadas de todas las funciones en un archivo fuente C pictóricamente. Sería genial si pudiera imprimir este gráfico.

¿Alguna buena herramienta para hacer eso (no necesita ser herramientas gratuitas)?

+3

Relacionados: http://stackoverflow.com/a/17844310/1959808 –

Respuesta

46
+0

qusetion about CodeViz, Si pasa su código a ese generará el código o no? O usted mismo debería hacer el gráfico por codevis? – alex

+0

Acabo de probar Egipto. Es gráfico es horrible. No estoy seguro acerca de los demás. – ar2015

3

Astrée es la herramienta más robusta y sofisticada que existe, en mi humilde opinión.

4

Nuestra DMS Software Reengineering Toolkit tiene static control/dataflow/points-to/call graph analysis que se ha aplicado a sistemas grandes (~~ 25 millones de líneas) de código C, y producido tales gráficos de llamadas, incluyendo funciones llamadas a través de punteros de función.

+1

Ah, bueno, es 2016 y ahora aparece un downvoter. Estoy seguro de que su voto negativo se basó en una evaluación precisa de que esta herramienta no puede hacer esto. Bueno, tal vez no. Seguro que hace lo que OP solicitó. –

+1

Tome un voto popular para contrarrestar eso. No me importa, es tu software o propietario siempre que haga el trabajo :-) –

19

KCachegrind

https://kcachegrind.github.io/html/Home.html

Uso:

imagen gráfica
sudo apt-get install -y kcachegrind valgrind 
gcc main.c 
valgrind --tool=callgrind ./a.out 
# Generates a callgrind.out.<PID> file. 
kcachegrind callgrind.out.1234 
# Opens a GUI to visualize callgrind data. 

Muestra exportado en un programa hola mundo:

Este método tiene la ventaja de que no necesita el código fuente para ver el gráfico de llamadas, solo el ejecutable.

Ejecuta el programa y las notas cada vez que se llama a una función de otro, un llamado análisis dinámico, en contraste con el análisis estático que analiza el código fuente sin ejecutarlo.

Versión no pictórica de esta pregunta: Tool to trace local function calls in Linuxcflow es una buena opción simplista.

gcc -finstrument-functions + eTrace

https://github.com/elcritch/etrace

-finstrument-functionsadds callbacks, eTrace Parces el archivo ELF e implementa todas las devoluciones de llamada.

no pude conseguir que funcione sin embargo desgracia: Why doesn't `-finstrument-functions` work for me?

salida reivindicada es de formato:

\-- main 
| \-- Crumble_make_apple_crumble 
| | \-- Crumble_buy_stuff 
| | | \-- Crumble_buy 
| | | \-- Crumble_buy 
| | | \-- Crumble_buy 
| | | \-- Crumble_buy 
| | | \-- Crumble_buy 
| | \-- Crumble_prepare_apples 
| | | \-- Crumble_skin_and_dice 
| | \-- Crumble_mix 
| | \-- Crumble_finalize 
| | | \-- Crumble_put 
| | | \-- Crumble_put 
| | \-- Crumble_cook 
| | | \-- Crumble_put 
| | | \-- Crumble_bake 

Probablemente el método más eficiente, además de un hardware específico rastreo de apoyo, pero tiene la desventaja de que tiene para recompilar el código

4

Puede consultar mi generador de árbol de llamadas en C basado en bash here. Le permite especificar una o más funciones de C para las que desea información de la persona que llama y/o llama, o puede especificar un conjunto de funciones y determinar el gráfico de accesibilidad de las llamadas de función que las conecta ... Es decir, dime todas las formas en que main(), foo() y bar() están conectadas. Utiliza graphviz/dot para un motor de gráficos.