2009-03-30 5 views
9

Can gcc escupir, dado un archivo C, una lista de todas las llamadas de función que ocurren, con nombre de archivo y número de línea para la llamada y para la declaración de la función?cómo hacer gcc escupir una asignación de gráficos de flujo a números de línea de código fuente

Sé que gcc de alguna manera conserva esta información con -g (los depuradores se basan en ella) y que puede volcar los gráficos de flujo de control con -dr (pero sin nombres de archivos o líneas); pero ¿hay una herramienta lista para usar que tome la salida de gcc y haga lo que yo quiera?

La razón por la que quiero dicha herramienta a utilizar gcc es que esto permitirá que lo uso con el sistema de construcción estándar de la mayoría del software basado en gcc viene con (por ejemplo ./configure & & marca), incluso en los casos donde las herramientas que confiar en su propio preprocesador y/o analizador son una gran molestia para encajar. Ya conozco varias de esas herramientas, por ejemplo ctags. Entonces, esta pregunta es una continuación de question 525899.

Respuesta

9

Pruebe la opción -fdump-tree-fixupcfg-lineno de gcc.

Se imprimirá "bastante bien" AST (con números de línea) de una manera que se pueda analizar fácilmente utilizando lexer relativamente simple o cualquier motor de expresiones regulares. Sólo tiene que encontrar todos los no-palabras clave precedidas por '=' y seguido de '(' - será llamadas a funciones

Todas las expresiones complejas se pueden dividir en varias líneas de modo no aparecerán dos llamadas a funciones en una sola línea

..

Take programa simple:

#include <stdio.h> 
#include <stdlib.h> 
#include <math.h> 

#define PI (3.1415926536) 

int main(int argc, char *argv[]) { 
    double angle = PI/2.0; 
    printf("Sine = %lf, cosine = %lf\n", sin(angle), cos(angle)); 
    return EXIT_SUCCESS; 
} 

compilarlo con -fdump-tree-fixupcfg-lineno y se obtiene así:

main (argc, argv) 
{ 
    double angle; 
    int D.3381; 
    double D.3380; 
    double D.3379; 

    # BLOCK 2, starting at line 8 
    # PRED: ENTRY (fallthru) 
    [test.c : 8] angle = 1.57079632680000003119857865385711193084716796875e+0; 
    [test.c : 9] D.3379 = [test.c : 9] cos (angle); 
    [test.c : 9] D.3380 = [test.c : 9] sin (angle); 
    [test.c : 9] printf (&"Sine = %lf, cosine = %lf\n"[0], D.3380, D.3379); 
    [test.c : 10] D.3381 = 0; 
    return D.3381; 
    # SUCC: EXIT 

} 

usted no recibirá ningún complejo expresiones: solo asignaciones y llamadas a funciones y sin macros CPP, muy fáciles de analizar. Los bucles y condicionales no lo hacen mucho más difícil.

+0

Esto es casi exactamente lo que esperaba. Las llamadas dentro de un if (0) parecen estar ausentes, y puede haber más detalles para tener en cuenta, pero es mucho más que cualquier cosa que haya encontrado hasta ahora. ¡Muchas gracias! – reinierpost

+0

La opción se ha eliminado: http://stackoverflow.com/questions/2161567/i-need-a-tree-dump-option-which-doesnt-exist-any-more-in-current-gcc-versions – reinierpost

+0

@ reinierpost Sí, soy consciente de eso, como puedes ver en mi comentario a la pregunta que has vinculado, pero cambió después de mi publicación. Sin embargo, desde GCC 4.5 puede usar los complementos de GCC (como una función estándar) para que pueda obtener AST desde el front-end de GCC y procesarlo - esa es la forma en que solucionó este problema. – qrdl

3

Valgrind y kcachegrind parece una buena herramienta para este uso:

valgrind --tool=callgrind --dump-instr=yes ./your_binary 

Esto le dará un archivo llamado callgrind.out.pid que se puede abrir con kcachegrind. Esto le permitirá ver muchas informaciones como llamar a gráfico, nombre de archivo ...

+0

Gracias por su sugerencia. Esto me dará un callgraph dinámico, que muestra las llamadas que se realizan a medida que se ejecuta el programa, ¿verdad? Yo también necesito eso, pero no es lo que estaba pidiendo. Pero definitivamente voy a probar KCacheGrind. – reinierpost

+0

No está tan cerca como esperaba. No imprime números de línea con declaraciones, ni imprime números de línea de llamadas con llamadas. – reinierpost

3

Puede probar Treehydra, un complemento de GCC que le da acceso de solo lectura a las representaciones internas de código de GCC durante la compilación. (Sin embargo, es una tarea un tanto complicada de construir, y no estoy seguro de que dé mejores resultados que -fdump- * para este problema.)

+0

No estaba al tanto de TreeHydra y lo verificaré la próxima vez que lo necesite. ¡Gracias! – reinierpost

Cuestiones relacionadas