Estoy tratando de generar un gráfico de llamada con el que averiguar todas las posibles rutas de ejecución que están afectando a una función en particular (para no tener que averiguar todas las rutas manualmente, ya que hay muchas rutas que conducen a esta función ). Por ejemplo:
path 1: A -> B -> C -> D
path 2: A -> B -> X -> Y -> D
path 3: A -> G -> M -> N -> O -> P -> S -> D
...
path n: ...
Probé Codeviz y Doxygen, de alguna manera ambos resultados no muestran nada más que llamadas de la función de destino, D. En mi caso, D es una función miembro de una clase cuyo objeto será envuelto dentro de un puntero inteligente. Los clientes siempre obtendrán el objeto de puntero inteligente a través de una fábrica para invocar D.
¿Alguien sabe como lograr esto?
fuente
Pass::print not implemented for pass: 'Print call graph to 'dot' file'!
¿Qué pasa con eso? clang 3.8-analyze
opción por alguna razón. Otra pregunta: ¿puedo establecer el nombre del archivo de salida en algo diferente a./callgraph.dot
?Puede lograrlo usando doxygen (con la opción de usar dot para la generación de gráficos).
Con Johannes Schaub - litb main.cpp, genera esto:
doxygen / dot son probablemente más fáciles de instalar y ejecutar que clang / opt. ¡No logré instalarlo yo mismo y por eso traté de encontrar una solución alternativa!
fuente
Calcular estáticamente un gráfico de llamadas C ++ preciso es difícil, porque necesita un analizador de idiomas preciso, una búsqueda de nombres correcta y un buen analizador de puntos que respete la semántica del lenguaje correctamente. Doxygen no tiene ninguno de estos, no sé por qué la gente dice que le gusta C ++; es fácil construir un ejemplo de C ++ de 10 líneas que Doxygen analiza erróneamente).
Es mejor que ejecute un generador de perfiles de tiempo que recopile un gráfico de llamadas de forma dinámica (esto describe el nuestro) y simplemente ejercite muchos casos. Dichos perfiladores le mostrarán el gráfico de llamadas real ejercitado.
EDITAR: De repente recordé Entender para C ++ , que afirma construir gráficos de llamadas. No sé qué usan para un analizador, o si hacen bien el análisis detallado; No tengo experiencia específica con su producto.
Estoy impresionado por la respuesta de Schaub, usando Clang; Esperaría que Clang tenga todos los elementos correctos.
fuente
Puede usar CppDepend , puede generar muchos tipos de gráficos
fuente
Para que el
clang++
comando encuentre archivos de encabezado estándarmpi.h
, se deben usar dos opciones adicionales-### -fsyntax-only
, es decir, el comando completo debe verse como:fuente
El "Analizador de C ++ Bsc" puede mostrar gráficos de llamadas - leyendo el archivo generado por la utilidad bscmake.
fuente
doxygen + graphviz podría resolver la mayoría de los problemas cuando queremos generar un gráfico de llamadas, luego entregado a la mano de obra.
fuente
Scitools Understand es una herramienta fantástica , mejor que todo lo que conozco para la ingeniería inversa , y genera gráficos de alta calidad .
Pero tenga en cuenta que es bastante caro y que la versión de prueba tiene su gráfico de llamada de mariposa limitado a solo un nivel de llamada (en mi humilde opinión, creo que no se ayudan a sí mismos al hacerlo ...)
fuente