Articulo de referencia

Gráfico de llamadas

Un gráfico de llamadas generado para un programa informático sencillo en Python. Un grafo de llamadas (también conocido como multigrafo de llamadas [ 1 ] [ 2 ] ) es un grafo de ...

Un gráfico de llamadas generado para un programa informático sencillo en Python.

Un grafo de llamadas (también conocido como multigrafo de llamadas [ 1 ] [ 2 ] ) es un grafo de flujo de control [ 3 ] que representa las relaciones de llamada entre subrutinas en un programa informático . Cada nodo representa un procedimiento y cada arista (f, g) indica que el procedimiento f llama al procedimiento g . Por lo tanto, un ciclo en el grafo indica llamadas recursivas a procedimientos.

Conceptos básicos

Los grafos de llamadas pueden ser dinámicos o estáticos. [ 4 ] Un grafo de llamadas dinámico es un registro de la ejecución del programa, por ejemplo, como resultado de un analizador de rendimiento. Por lo tanto, un grafo de llamadas dinámico puede ser exacto, pero solo describe una ejecución del programa. Un grafo de llamadas estático es un grafo de llamadas diseñado para representar todas las posibles ejecuciones del programa. El grafo de llamadas estático exacto es un problema indecidible , por lo que los algoritmos de grafos de llamadas estáticos generalmente son sobreaproximaciones. Es decir, cada relación de llamada que ocurre está representada en el grafo, y posiblemente también algunas relaciones de llamada que nunca ocurrirían en ejecuciones reales del programa.

Los grafos de llamadas se pueden definir para representar distintos grados de precisión. Un grafo de llamadas más preciso se aproxima con mayor exactitud al comportamiento del programa real, a costa de un mayor tiempo de cálculo y un mayor consumo de memoria. El grafo de llamadas más preciso es totalmente sensible al contexto , lo que significa que, para cada procedimiento, el grafo contiene un nodo independiente para cada pila de llamadas con la que se puede activar dicho procedimiento. Un grafo de llamadas totalmente sensible al contexto se denomina árbol de contexto de llamadas . Este se puede calcular fácilmente de forma dinámica, aunque puede consumir una gran cantidad de memoria. Los árboles de contexto de llamadas no suelen calcularse de forma estática, ya que tardarían demasiado en un programa grande. El grafo de llamadas menos preciso es insensible al contexto , lo que significa que solo hay un nodo para cada procedimiento.

Con lenguajes que incluyen despacho dinámico (por ejemplo, Java o C++ ), [ 5 ] funciones de primera clase (por ejemplo, Python o Racket ) o punteros a funciones (por ejemplo, C ), el cálculo preciso de un grafo de llamadas estático requiere los resultados del análisis de alias . A la inversa, el cálculo preciso de alias requiere un grafo de llamadas. Muchos sistemas de análisis estático resuelven la aparente regresión infinita calculando ambos simultáneamente.

Usos

Los grafos de llamadas pueden utilizarse de diversas maneras. Una aplicación sencilla consiste en encontrar procedimientos que nunca se llaman. Los grafos de llamadas pueden servir como documentación para que los humanos comprendan los programas . [ 6 ] También pueden utilizarse para detectar anomalías en la ejecución de programas o ataques de inyección de código. [ 7 ]

Software

Generadores de gráficos de llamadas de software gratuito

Gráfico de llamadas en tiempo de ejecución (la mayoría de las herramientas enumeradas son analizadores de rendimiento con funcionalidad de gráfico de llamadas).

  • gprof : incluido en BSD o parte de las utilidades binarias de GNU.
  • callgrind: parte de Valgrind
  • KCachegrind : potente herramienta para generar y analizar gráficos de llamadas basados ​​en datos generados por callgrind.
  • Monitor de Actividad de Mac OS X: El monitor de procesos con interfaz gráfica de Apple, Monitor de Actividad, incluye un generador de gráficos de llamadas integrado que puede muestrear procesos y generar un gráfico de llamadas. Esta función solo está disponible en Mac OS X Leopard.
  • OpenPAT: incluye la control_flowherramienta que crea automáticamente un gráfico de llamadas de Graphviz a partir de mediciones en tiempo de ejecución.
  • pprof , herramienta de código abierto para la visualización y el análisis de datos de perfil, que se utilizará junto con gperftools .
  • CodeAnalyst de AMD (publicado bajo licencia GPL)
  • makeppgraph es un generador de gráficos de dependencias (a nivel de módulo) para compilaciones realizadas con makepp .
  • API de eventos únicos de Intel(R) (gratuita, de código abierto)

Estático para obtener gráficos de llamadas sin ejecutar la aplicación.

C/C++
  • Sourcetrail crea un gráfico de llamadas estático que el usuario puede explorar dinámicamente. También es compatible con Python y Java.
  • doxygen : Utiliza Graphviz para generar diagramas estáticos de llamadas/herencia.
  • Cally : una herramienta que utiliza archivos de lenguaje de transferencia de registros (RTL) de GCC para construir gráficos de llamadas de llamador o llamado para proyectos en C.
  • cflow : GNU cflow es capaz de generar el grafo de llamadas directas e invertidas de un programa C.
  • egypt : un pequeño script de Perl que utiliza gcc y Graphviz para generar el gráfico de llamadas estáticas de un programa en C.
  • Analizo : calcula métricas del código fuente y genera gráficos de dependencias.
  • CCTree : Complemento nativo de Vim que puede mostrar gráficos de llamadas estáticas leyendo una base de datos cscope . Funciona para programas en C.
  • codeviz : un generador estático de grafos de llamadas (el programa no se ejecuta). Implementado como un parche para gcc ; funciona con programas en C y C++.
  • calltree.sh : Funciones de shell Bash que combinan cscope, graphviz y una muestra de herramientas de renderizado de puntos para mostrar las relaciones entre "llamador" y "llamado" por encima, por debajo o entre las funciones C que especifique.
  • tceetree : al igual que calltree.sh, conecta Cscope y Graphviz , pero es un ejecutable en lugar de un script bash.
Ir
  • go-callvis : un generador interactivo de grafos de llamadas para programas Go cuya salida se puede dibujar con Graphviz.
Multilingüe
  • callGraph : generador de gráficos de llamadas de código abierto para AWK, Bash, BASIC, Dart, Fortran, Go, Lua, JavaScript, Julia, Kotlin, MATLAB, Perl, Pascal, PHP, Python, R, Raku, Ruby, Rust, Scala, Swift, TCL y TypeScript.
.NETO
  • NDepend es una herramienta de análisis estático para código .NET. Esta herramienta admite una gran cantidad de métricas de código y permite visualizar las dependencias mediante gráficos dirigidos y matrices de dependencias.
PHP, Perl y Python
  • Devel::NYTProf : un analizador de rendimiento y generador de diagramas de llamadas para Perl.
  • phpCallGraph : un generador de gráficos de llamadas para programas PHP que utiliza Graphviz . Está escrito en PHP y requiere al menos PHP 5.2.
  • pycallgraph Archivado el 25/05/2007 en Wayback Machine : un generador de gráficos de llamadas para programas Python que utiliza Graphviz .
  • pyan : un generador de gráficos de llamadas estáticas para programas Python que utiliza Graphviz .
  • gprof2dot : Un generador de gráficos de llamadas escrito en Python que convierte datos de perfilado para muchos lenguajes/entornos de ejecución en un gráfico de llamadas de Graphviz .
  • code2flow : Un generador de gráficos de llamadas para programas Python y JavaScript que utiliza Graphviz.
  • rcviz : Módulo de Python para renderizar gráficos de llamadas generados en tiempo de ejecución con Graphviz . Cada nodo representa una invocación de una función con los parámetros que se le pasan y el valor de retorno.
XQuery
  • Gráficos de llamadas XQuery del Wikilibro XQuery : Un generador de gráficos de llamadas para un módulo de función XQuery que utiliza Graphviz.

Generadores de gráficos de llamadas propietarios

Banco de pruebas LDRA
Motores de análisis estático y dinámico tanto para software anfitrión como para software embebido, con una gran variedad de informes que incluyen gráficos de llamadas.
Analizador de proyectos
Analizador de código estático y generador de gráficos de llamadas para código Visual Basic.
Experto visual
Analizador de código estático y generador de gráficos de llamadas para código Oracle PL/SQL , SQL Server Transact-SQL , C# y PowerBuilder.
Analizador de rendimiento Intel VTune
Instrumentación del perfilador para mostrar el gráfico de llamadas y las estadísticas de ejecución.
Kit de herramientas para la reingeniería de software de DMS
Herramienta de análisis de programas personalizable con extracción estática de gráficos de llamadas globales de todo el programa para C, Java y COBOL.
Visualización gráfica
Convierte la representación textual de cualquier gráfico (incluido un gráfico de llamadas) en una imagen.
tsort
Utilidad de línea de comandos que realiza una ordenación topológica.

Gráfico de ejemplo

Un ejemplo de gráfico de llamadas generado a partir del autoanálisis de gprof :

índice llamado nombre |índice llamado nombre 72384/72384 sym_id_parse [54] | 1508/1508 cg_dfn [15] [3] 72384 coincidencias [3] |[13] 1508 visitas previas [13] ---------------------- |---------------------- 4/9052 cg_tally [32] | 1508/1508 cg_assemble [38] 3016/9052 hist_print [49] |[14] 1508 propagate_time [14] 6032/9052 propagate_flags [52] |---------------------- [4] 9052 sym_lookup [4] | 2 cg_dfn [15] ---------------------- | 1507/1507 cg_assemble [38] 5766/5766 core_create_function_syms [41]|[15] 1507+2 cg_dfn [15] [5] 5766 core_sym_class [5] | 1509/1509 está numerado [9] ---------------------- | 1508/1508 está_ocupado [11] 24/1537 parse_spec [19] | 1508/1508 pre_visit [13] 1513/1537 core_create_function_syms [41]| 1508/1508 post_visit [12] [6] 1537 sym_init [6] | 2 cg_dfn [15] ---------------------- |---------------------- 1511/1511 core_create_function_syms [41]| 1505/1505 hist_print [49] [7] 1511 get_src_info [7] |[16] 1505 print_line [16] ---------------------- | 2/9 print_name_only [25] 2/1510 arc_add [31] |---------------------- 1508/1510 cg_assemble [38] | 1430/1430 core_create_function_syms [41] [8] 1510 arc_lookup [8] |[17] 1430 source_file_lookup_path [17] ---------------------- |---------------------- 1509/1509 cg_dfn [15] | 24/24 sym_id_parse [54] [9] 1509 está_numerado [9] |[18] 24 parse_id [18] ---------------------- | 24/24 parse_spec [19] 1508/1508 propagate_flags [52] |---------------------- [10] 1508 inherit_flags [10] | 24/24 parse_id [18] ---------------------- |[19] 24 parse_spec [19] 1508/1508 cg_dfn [15] | 24/1537 sym_init [6] [11] 1508 está_ocupado [11] |---------------------- ---------------------- | 24/24 principal [1210] 1508/1508 cg_dfn [15] |[20] 24 sym_id_add [20] [12] 1508 post_visit [12] | 

Véase también

Referencias

  1. Callahan, D.; Carle, A.; Hall, MW ; Kennedy, K. (abril de 1990). "Construcción del multigrafo de llamadas a procedimientos". IEEE Transactions on Software Engineering . 16 (4): 483– 487. doi : 10.1109/32.54302 .
  2. Uday Khedker; Amitabha Sanyal; Bageshri Sathe (2009). Análisis del flujo de datos: teoría y práctica . CRC Press. pág. 234. ISBN  978-0-8493-3251-7.
  3. Pankaj Jalote (1997). Un enfoque integrado para la ingeniería de software . Springer Science & Business Media. pág . 372. ISBN  978-0-387-94899-7.
  4. Ryder, BG (mayo de 1979). "Construcción del grafo de llamadas de un programa". IEEE Transactions on Software Engineering . SE-5 (3): 216–226 . doi : 10.1109/tse.1979.234183 . S2CID 16527042 . 
  5. Grove, David; DeFouw, Greg; Dean, Jeffrey; Chambers, Craig; Grove, David; DeFouw, Greg; Dean, Jeffrey; Chambers, Craig (9 de octubre de 1997). "Construcción de grafos de llamadas en lenguajes orientados a objetos" . ACM SIGPLAN Notices . 32 (10). ACM: 108, 108– 124, 124. doi : 10.1145/263700.264352 .
  6. Eisenbarth, T.; Koschke, R.; Simon, D. (2001). "Ayudando a la comprensión de programas mediante el análisis de características estáticas y dinámicas". Actas de la Conferencia Internacional IEEE sobre Mantenimiento de Software. ICSM 2001. págs. 602–611 . doi : 10.1109/icsm.2001.972777 . ISBN  0-7695-1189-9. S2CID 5934718 . 
  7. Gao, Debin; Reiter, Michael K.; Song, Dawn (25 de octubre de 2004). «Extracción de grafos de ejecución mediante el método de caja gris para la detección de anomalías». Actas de la 11.ª conferencia ACM sobre seguridad informática y de comunicaciones - CCS '04 . ACM. págs. 318–329 . doi : 10.1145/1030083.1030126 . ISBN  1581139616. S2CID 1189805 . 
Obtenido de " https://en.wikipedia.org/w/index.php?title=Call_graph&oldid=1319999211 "