9
votes

Existe-t-il une fonctionnalité de compilateur pour injecter une entrée de fonction personnalisée et une sortie de code?

codant actuellement sur Windows avec VS2005 (mais cela ne voudrait pas savoir s'il ya des options pour d'autres compilateurs et plates-formes. Je suis le plus intéressé par OSX comme une plate-forme alternative. J'ai un programme C (no c ++) et je "D Aiment faire ce qui suit ...

donné une fonction, dites ... xxx

J'aimerais mettre un extrait de code au point d'entrée et au point de sortie. Mais, je préférerais ne pas avoir à modifier les 100 des fonctions qui sont déjà là-bas. Existe-t-il un moyen de définir la saisie de fonction et la sortie du code que le compilateur s'injectera à toutes mes fonctions sans avoir à les modifier tous?

La plupart des solutions que j'ai trouvées ou que j'ai essayées vous obligeront à éditer chaque fonction unique, qui fait beaucoup de travail. Je pense que quelqu'un d'autre a dû frapper quelque chose comme ça déjà et l'a résolu. Je ne peux pas être unique dans cette demande que je soupçonne.

c

2 commentaires

Sauf si vous utilisez cela pour une forme de débogage ou de journalisation, cela me frappe comme une mauvaise idée.


Appuyé - dans la bonne chance, tout le monde codent toujours avec vs.


4 Réponses :


10
votes

1 commentaires

Je ne pense pas non plus - le _penter MSDN page liée ci-dessus affiche un exemple écrit en C avec un #include .



1
votes

Vous recherchez quelque chose appelé Programmation orientée verso ou AOP.

Ce n'est pas quelque chose qui est supporté de manière nativement en C (ou C ++). Certaines implémentations basées sur la bibliothèque sont énumérées sur la page liée pour C (bien que je ne sais pas à quel point ces derniers sont matures / utiles)


2 commentaires

Cela nécessite probablement un compilateur / préprocesseur avant d'extrémité pour insérer le code d'aspect dans toutes les fonctions concernées.


@Loadmaster, probablement. Serait-ce si mauvais chose?



8
votes

GCC a l'indicateur de fonctions -Finstrument qui vous permet de définir deux fonctions qui seront appelées au début et à la fin de chaque appel de la fonction:

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


1 commentaires

De même, -pg introduit un appel à mcount à l'entrée de toutes les fonctions, bien qu'il ne fournisse pas de crochet de sortie correspondant.



0
votes

OpenWatCom Compilateurs C et C ++ a -ee et -e-PARAMETERS POUR CELA:

-en           emit routine names in the code segment


0 commentaires