2009-09-24 20 views
6

Attualmente codifica su Windows con VS2005 (ma non mi dispiacerebbe sapere se ci sono opzioni per altri compilatori e piattaforme. Sono più interessato a OSX come piattaforma alternativa.) Ho un programma C (senza C++) e I ' d piace fare quanto segue ...Esiste una funzione di compilazione per l'inserimento di voci di funzione e di uscita personalizzate?

Data una funzione, diciamo ...

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

mi piacerebbe mettere un frammento di codice al punto di ingresso e nel punto di uscita. MA, preferirei non dover modificare i 100 di funzioni che sono già là fuori. C'è un modo per definire l'entrata della funzione e il codice di uscita che il compilatore inietterà per tutte le mie funzioni senza doverle modificare tutte?

La maggior parte delle soluzioni che ho trovato o provato richiedono che io modifichi ogni singola funzione, che è molto lavoro. Immagino che qualcun altro debba aver già colpito qualcosa del genere e averlo risolto. Non posso essere unico in questa richiesta, sospetto.

+1

A meno che non si sta utilizzando questo per una qualche forma di debug o di registrazione, questo mi sembra un cattiva idea. – Brian

+0

Seconded - nel caso in cui qualcuno ancora codifica con vs. – quixver

risposta

8

È specifico di Microsoft, ma è possibile collegare le funzioni _penter e _pexit per fare qualcosa quando si entra e si esce da una funzione - sarà necessario compilare il progetto con alcune bandiere speciali.

C'è a little bit of a tutorial here e puoi trovare qualche altro risultato su come usarli su Google. Inoltre, this blog post passa in dettaglio all'assieme che è necessario fare per evitare di incasinare lo stack all'entrata e all'uscita.

+0

questo è solo per C++, giusto? – LB40

+0

Io non la penso così - la pagina MSDN '_penter' linkata sopra mostra un esempio scritto in C con un' #include '. –

1

Stai cercando qualcosa chiamato aspect oriented programming o AOP.

Questo non è qualcosa supportato nativamente in C (o C++). Esistono alcune implementazioni basate sulla libreria elencate nella pagina collegata per C (anche se non so quanto siano mature/utili)

+1

Questo probabilmente richiede un compilatore/preprocessore front-end per inserire il codice aspetto in tutte le funzioni interessate. –

+0

@Loadmaster, probabilmente. Sarebbe una cosa così brutta? – Glen

5

GCC ha il flag -finstrument-functions che consente di definire due funzioni che verranno chiamate all'inizio e alla fine di ogni chiamata di funzione:

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

Analogamente, '-pg' introduce una chiamata a 'mcount' all'entrata di tutte le funzioni, sebbene non fornisca un hook di uscita corrispondente. – ephemient

0

OpenWatcom C e compilatori C++ avere parametri -EE e -EP per questo:

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

causeranno il compilatore di emettere chiamate __EPI e __PRO routine di hook definita dall'utente es.

C'è anche

-en   emit routine names in the code segment 

che emetterà il nome della funzione nel codice oggetto come una stringa di caratteri poco prima della generazione della sequenza funzione prologo. Può essere utile per la routine __PRO.

maggiori informazioni in queste e altre opzioni del compilatore può essere trovato nella guida C/C++ utente disponibili tra gli altri manuali in http://openwatcom.org/index.php/Manuals

Problemi correlati