2009-09-24 5 views
6

Actualmente estoy programando en Windows con VS2005 (pero no me importaría saber si hay opciones para otros compiladores y plataformas. Estoy más interesado en OSX como una plataforma alternativa.) Tengo un programa C (sin C++) y estoy ' d como hacer lo siguiente ...¿Hay una función de compilación para insertar la entrada de función personalizada y el código de salida?

Dada una función, por ejemplo ...

int MyFunction(int myparam) 
{ 
    // Entry point. 
    ... 
    // Exit point. 
    return 1; 
} 

me gustaría poner un fragmento de código en el punto de entrada y en el punto de salida. PERO, prefiero no tener que modificar las 100 funciones que ya existen. ¿Hay alguna manera de definir el código de entrada y salida de funciones que el compilador inyectará para todas mis funciones sin tener que modificarlas todas?

La mayoría de las soluciones que he encontrado o probado me obligan a editar cada función, lo que es mucho trabajo. Me imagino que alguien más ya debe haber golpeado algo así y lo resolvió. No puedo ser único en esta solicitud, sospecho.

+1

A menos que utilice esto para algún tipo de depuración o registro, esto me parece una mala idea. – Brian

+0

Secundado - en caso de que alguien todavía codifique con vs. – quixver

Respuesta

8

Es específico de Microsoft, pero puede enganchar en las funciones _penter y _pexit para hacer algo al ingresar y salir de una función: tendrá que compilar su proyecto con algunas banderas especiales.

Hay a little bit of a tutorial here, y puede encontrar algunos resultados más sobre cómo usarlos en Google. Además, this blog post detalla el ensamblaje que debe hacer para evitar arruinar la pila al ingresar y salir.

+0

, esto es solo para C++, ¿verdad? – LB40

+0

No lo creo - la página '_penter' de MSDN vinculada anteriormente muestra un ejemplo escrito en C con un' #include '. –

1

Está buscando algo llamado aspect oriented programming o AOP.

Esto no es algo que se admita de forma nativa en C (o C++). Hay algunas implementaciones basadas en bibliotecas enumeradas en la página enlazada para C (aunque no sé qué tan maduras/útiles son)

+1

Esto probablemente requiere un compilador/preprocesador front-end para insertar el código de aspecto en todas las funciones afectadas. –

+0

@Loadmaster, probablemente. ¿Sería eso tan malo? – Glen

5

GCC tiene el distintivo -finstrument-functions que le permite definir dos funciones que se llamarán al principio y al final de cada llamada a la función:

void __cyg_profile_func_enter(void *this_fn, void *call_site); 
void __cyg_profile_func_exit(void *this_fn, void *call_site); 
+1

Del mismo modo, '-pg' introduce una llamada a' mcount' en la entrada de todas las funciones, aunque no proporciona un gancho de salida correspondiente. – ephemient

0

OpenWatcom compiladores de C y C++ de tener parámetros -ee y Ep para ello:

-ee   call epilogue hook routine 
-ep[=<num>] call prologue hook routine with <num> stack bytes available 

que hará que el compilador para emitir llamadas a __EPI y __Rutina de enlace definida por el usuario de PRO es.

Existe también

-en   emit routine names in the code segment 

que emitirá el nombre de función en el código objeto como una cadena de caracteres justo antes de que se genera la secuencia de la función prólogo. Puede ser útil para la rutina __PRO.

Más información en estas y otras opciones del compilador se puede encontrar en la guía de C/C++ de usuario disponible entre otros manuales en http://openwatcom.org/index.php/Manuals

Cuestiones relacionadas