2012-03-09 10 views
15

¿existe algo así como una herramienta (gratuita) que muestre un gráfico de todas las llamadas de funciones en una función dada? Por ejemplo, si lo uso en una función compleja fun() que estoy tratando de entender, me mostraría todas las funciones llamadas por fun() en orden, entonces tendría la posibilidad de ver lo mismo para el función llamada por diversión(), y así sucesivamente. Estoy buscando esto para el código C++. ¿Existe tal cosa?C++ code dependency/call-graph "viewer"?

editar: Estoy utilizando VS 2008 si eso ayuda, pero estaba pensando que tal software trabajaría en los archivos de origen de todos modos

+0

Para cualquier programa no trivial, la salida tendría que ser indescriptiblemente torpe ... sin embargo, con la heurística de omisión inteligente - podría funcionar. – leftaroundabout

+0

Bueno, no necesitas heurística muy inteligente. Un corte a dos o tres niveles de profundidad sería suficiente. Obviamente no puedes mostrar todo desde 'main' hacia abajo. El problema principal que veo es funciones 'virtuales', donde la implementación real llamada se determina en tiempo de ejecución. – MSalters

+0

posible duplicado de [Herramientas para obtener una función gráfica gráfica de llamada de código] (http://stackoverflow.com/questions/517589/tools-to-get-a-pictorial-function-call-graph-of-code) – finnw

Respuesta

18

Doxygen puede hacer esto. Ver la opción de configuración CALL_GRAPH:

Si los CALL_GRAPH y HAVE_DOT etiquetas se fijan a continuación YES doxygen generará un gráfico de dependencias de llamadas para cada función global o método de clase. Tenga en cuenta que habilitar esta opción aumentará significativamente el tiempo de ejecución. Por lo tanto, en la mayoría de los casos, será mejor habilitar los gráficos de llamadas para las funciones seleccionadas solo con el comando \ callgraph.

3

Si existen tales cosas. Google bajo el encabezado análisis de código estático. Hay, por ejemplo, herramientas como Understand, y es muy probable que su compilador pueda hacer esto también para lo cual lo remito a su documentación.

+1

(¿Qué compilador usa * usted *?: - /) –

+1

Uso principalmente el compilador Intel Fortran pero los compiladores Intel C/C++ también pueden producir gráficos de llamadas. Pero Doxygen, como lo sugirió Greg, es probablemente una mejor respuesta. –

+0

¿Cómo puede Doxygen ser una mejor respuesta, si a) hay sobrecargas o herencia múltiple (qué, Doxygen hace una búsqueda Koenig completa?) O hay una llamada de función indirecta? –

2

g ++ y la mayoría de los compiladores pueden hacer lo que usted desee. Se llama profiling. También está el oprofile. Un generador de perfiles le proporciona el gráfico de llamada de una aplicación after su ejecución. Esto es muy útil para estudiar el código, también puede recorrer el resultado [de depuración] mientras observa el gráfico. Un analizador de código, por el contrario, le dará todas las rutas de llamada posibles, sin embargo, no podrá ver la ruta significativa fácilmente.

+1

Perfilado! = Análisis estático –

+0

¿Análisis estático? – perreal

+2

Pero la creación de perfiles solo mostrará esos gráficos de llamadas, que en realidad se ejecutan, no "todos los posibles". –

6

Sí, Eclipse CDT Call Hierarchy ver proporciona exactamente esto. Por otra parte, este punto de vista tiene 2 opciones:

  • Mostrar personas que llaman
  • Mostrar Callees

Usted está preguntando por segundo, pero estoy prefieren el primero en análisis de código.

2

No conozco ninguna herramienta especialmente diseñada para esto. Sin embargo, hay algunas maneras de hacerlo:

  • El uso de un IDE (QtCreator es gratis, Visual Studio Express también podría ser útil, Eclipse CDT)
  • Utilizando (ctags) [http: // ctags. sourceforge.net/] y un editor de texto capaz.
  • Usando callgrind y las diversas vistas que trae. Ventaja: puedes ver las funciones que realmente se llaman. Desventaja: solo se ejecuta en unixes, y tienes que crear un perfil.
  • Usando Doxygen ... este es muy elegante, ya que genera una "vista" html de su código, siempre que proporcione las opciones correctas.
3

Puede usar callgrind, y es la herramienta GUI kcachegrind.

4

Intel(R) Single Event API es un proyecto de fuente abierta gratuito que utiliza GraphVis para la visualización de gráficos de llamada. Se requiere un poco de esfuerzo para realizar instrumentación manual o compilada, pero además de las estadísticas y los gráficos de llamadas, también obtendrá las vistas de horas extras. Example of the image you can get