2011-05-30 19 views
5

Según this answer, debe imprimir todos los nombres de función:¿Por qué `` -finstrument-functions` no funciona para mí?

[[email protected] test]# cat hw.c 
#include <stdio.h> 

int func(void) 
{ 
    return 1; 
} 
int main(void) 
{ 
    func(); 
    printf("%d",6); 
    return 6; 
} 
[[email protected] test]# gcc -Wall hw.c -o hw -finstrument-functions 
[[email protected] test]# ./hw 
6 
[[email protected] test]# gcc --version 
gcc (GCC) 4.1.2 20080704 (Red Hat 4.1.2-48) 
Copyright (C) 2006 Free Software Foundation, Inc. 

Pero ¿por qué no funciona para mí?

+0

La respuesta es incorrecta. –

Respuesta

5

Este es el manual de gcc:

-finstrument-funciones

Generar llamadas de instrumentación para entrada y salida a las funciones. Solo después de la entrada de la función y justo antes de la salida de la función , se invocarán las siguientes funciones de perfilado con la dirección de la función actual y su sitio de llamada. (En algunas plataformas, __builtin_return_address no funciona más allá de la fun- ción actual, por lo que la información del sitio llamada puede no ser disponible para las funciones de perfilado lo contrario.)

__cyg_profile_func_enter (void * this_fn, void * call_site);

void __cyg_profile_func_exit (void * this_fn, void * call_site);

A menos que algo implemente esas funciones, obtendrá errores del enlazador (que es lo que sucede con MinGW). Posiblemente, su versión de GCC proporciona implementaciones vacías.

que tengo que trabajar con MinGW GCC proporcionando esta implementación:

#include <stdio.h> 

void __cyg_profile_func_enter (void *this_fn, void *call_site) { 
    printf("entering %p\n", this_fn); 
} 

void __cyg_profile_func_exit (void *this_fn, void *call_site) { 
    printf("leaving %p\n", this_fn); 
} 

pero esto sólo da las direcciones de las funciones. Hubiera pensado que debería haber una implementación predeterminada de GCC de esto, pero parece que no lo es.

La gente también podría estar interesada en this visualisation of the call tree, que usa la bandera de -fintrument-functions -venta, no lo he probado yo mismo.

+0

@Neil Butterworth, ¿puedo agregar estas 2 funciones en mi archivo '.c' manualmente? –

+0

Podría, pero implementarlos es bastante complicado. –

+0

@Neil Butterworth, solo quiero que imprima nombres de funciones, ¿por qué es complicado? –

1

No implementó ninguna instrumentación. El interruptor -finstrument-functions simplemente le dice a gcc que llame a alguna función al ingresar y salir de cada función. Pero usted mismo tiene que definir estas funciones (normalmente esto se hace vinculando una biblioteca de perfiles).

+0

¿Qué pasos adicionales debo llevar a cabo para trabajar con el modificador '-finstrument-functions'? Espero que sea lo mínimo posible ... –

+0

@ compile-fan: [documentación] (http://gcc.gnu.org/onlinedocs/gcc/Code-Gen-Options.html#index-finstrument_002dfunctions-2168) menciona las dos funciones que deben implementarse. No sé si hay una biblioteca lista para usar que los use. –

0

La codificación de __cyg_profile_func_enter y __cyg_profile_func_exit no es complicada. La solución más fácil será asegurar que las funciones anteriores escriban los detalles de la dirección en un archivo y tengan un proceso separado para leer las direcciones del archivo y resolverlas usando la tabla de símbolos del ejecutable. Si intenta hacer la resolución de la dirección en la función en sí, puede tomar algún tiempo.

me encontré siguiente artículo - http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/

Qué utiliza addr2line de binutils para este propósito. Compruebe si esto le ayuda

+0

a veces ... es realmente útil simplemente imprimir nombres fn para corregir la corrección – kchoi

0

Se proporciona una implementación de lo que está buscando here.

+0

No funcionó para mí :-(https://github.com/elcritch/etrace/issues/3 –

Cuestiones relacionadas