superponer - Herramientas para obtener una función gráfica llamada gráfica del código
superponer graficas en r (8)
Nuestro DMS Software Reengineering Toolkit tiene control estático / flujo de datos / puntos a / gráfico de llamada que se ha aplicado a sistemas enormes (~~ 25 millones de líneas) de código C, y produjo dichos gráficos de llamadas, incluyendo funciones llamadas a través de punteros de función .
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 iniciando desde, digamos, main()
, y luego las funciones llamadas desde él, y así sucesivamente, más adentro de la función de nivel de hoja.
Necesito una herramienta que me proporcione un gráfico de llamadas de función de forma gráfica con funciones callee
y caller
conectadas por flechas o algo así, comenzando desde el main()
hasta el último nivel de función, o al menos mostrando un gráfico de llamadas de todas las funciones en una Archivo fuente C ilustrativamente. Sería genial si pudiera imprimir este gráfico.
¿Alguna buena herramienta para hacer eso (no necesita ser herramientas gratuitas)?
Understand hace un muy buen trabajo creando gráficos de llamadas.
Astrée es la herramienta más robusta y sofisticada que existe, en mi humilde opinión.
Puedes consultar mi generador de árbol de llamadas C basado en bash aquí . 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 llamadas de función que las conecta ... Es decir, todas las formas principales ( ), foo () y bar () están conectados. Utiliza graphviz / dot para un motor de gráficos.
Egipto (software libre)
KcacheGrind (GPL)
Graphviz (CPL)
CodeViz (GPL)
KcacheGrind
https://kcachegrind.github.io/html/Home.html
Uso:
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.
Imagen gráfica de muestra exportada en un programa hello world:
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 toma notas cuando se llama a una función desde otra, lo que se denomina análisis dinámico , en contraste con el análisis estático que analiza el código fuente sin ejecutarlo.
Versión no gráfica de esta pregunta: la herramienta para rastrear llamadas a funciones locales en Linux cflow
es una buena opción simplista.
gcc -finstrument-functions
+ etrace
https://github.com/elcritch/etrace
-finstrument-functions
agrega devoluciones de llamada , etrace parce el archivo ELF e implementa todas las devoluciones de llamada.
Sin embargo, no pude hacerlo funcionar desafortunadamente: ¿por qué `` -finstrument-functions` no funciona para mí?
La producción reclamada 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 del soporte de rastreo de hardware específico, pero tiene la desventaja de que tiene que recompilar el código.