2011-09-02 21 views
21

Sto cercando di capire come funziona il flag -pg (o -p) durante la compilazione del codice C con gcc.Come funziona il flag gcc -pg?

La documentazione ufficiale di gcc only states:

-pg
generare il codice extra per scrivere le informazioni sul profilo adatto per il gprof programma di analisi. È necessario utilizzare questa opzione quando si compilano i file di origine di cui si desiderano i dati e si deve anche utilizzarli durante il collegamento.

Questo mi ha davvero gli interessi, come sto facendo una piccola ricerca sul profiler - cercando di scegliere lo strumento migliore per il lavoro.

risposta

19

compilazione con -pg strumenti il ​​codice in modo che gprof rapporti informazioni dettagliate, vedere gprof's manual, 9.1 Implementation of Profiling

Profiling opere cambiando come ogni funzione nel vostro programma è compilato in modo tale che quando viene chiamato, sarà mettere da parte alcune informazioni da dove è stato chiamato. Da questo, il profiler può capire quale funzione lo ha chiamato e può contare quante volte è stato chiamato. Questo cambiamento è fatto dal compilatore quando il programma viene compilato con l'opzione -pg, che fa sì che ogni funzione di chiamare mcount (o _mcount, o __mcount, a seconda del sistema operativo e del compilatore) come uno dei suoi primi interventi.

La routine mcount, inclusa nella libreria di profilatura, è responsabile della registrazione in una tabella del grafico delle chiamate in memoria sia la sua routine padre (il figlio) che quella del genitore. Questo viene in genere eseguito esaminando il frame dello stack per trovare sia l'indirizzo del figlio, sia l'indirizzo di ritorno nel genitore originale. Poiché si tratta di un'operazione molto dipendente dalla macchina, lo stesso mcount è in genere una breve routine di stub in linguaggio assembly che estrae le informazioni richieste, quindi chiama __mcount_internal (una normale funzione C) con due argomenti: frompc e selfpc. __mcount_internal è responsabile per il mantenimento del grafico nella memoria di chiamata, che registra frompc, selfpc, e il numero di volte che ciascuna di tali archi di chiamata è stato attraversato.

...

Si prega di notare che con un tale profiler strumentazione, si sta profiling lo stesso codice che si compila nel rilascio senza profilatura strumentazione. Esiste un sovraccarico associato al codice della strumentazione stesso. Inoltre, il codice della strumentazione può alterare le istruzioni e l'utilizzo della cache di dati.

Contrariamente a un profiler di strumentazione, un profiler di campionamento come Intel VTune funziona su codice non strumentato guardando a intervalli regolari il contatore del programma del programma di destinazione utilizzando gli interrupt del sistema operativo. Può anche interrogare registri speciali della CPU per darti ancora più informazioni su cosa sta succedendo.

Vedi anche Profilers Instrumenting Vs Sampling

6

This link dà una breve spiegazione di come funziona gprof.

This link dà una vasta critica esso. (Controlla la mia risposta alla domanda archiviata.)

+0

Ho fatto praticamente tutto il mio profilo di velocità usando solo la pausa e il backtrace in gdb dopo aver letto quelli. –

+0

@David: Ho molti argomenti a riguardo, ma ho fatto * [questo esempio] (http://scicomp.stackexchange.com/a/1870/1262) * con esso. 700x di accelerazione. Non dico che la pausa sia carina, ma nessuno ha ottenuto un risultato del genere in nessun altro modo, che io sappia. –

+0

Mike Dunlavey: sfortunatamente il tuo secondo link non è più disponibile .. – duedl0r

0

fonte: http://elinux.org/images/0/0c/Bird-LS-2009-Measuring-function-duration-with-ftrace.pdf

Strumentazione è disponibile in due principali forme -esplicitamente tracepoint dichiarati, e tracepoint implicite. I tracepoint espliciti sono costituiti da dichiarazioni definite dallo sviluppatore che specificano l'ubicazione del tracepoint e ulteriori informazioni su quali dati devono essere raccolti in un particolare sito di traccia. I trace impliciti vengono inseriti automaticamente nel codice dal compilatore , a causa dei flag del compilatore o della ridefinizione dei macro comunemente utilizzati da parte dello sviluppatore .

Per le funzioni dello strumento in modo implicito, quando il kernel è configurato per supportare la funzione di traccia, il sistema di compilazione del kernel aggiunge -pg alle bandiere utilizzati con il compilatore. Questo fa sì che il compilatore aggiunga il codice a il prologo di ogni funzione, che chiama una routine speciale chiamata mcount. Questa opzione del compilatore è specificatamente pensata per essere utilizzata per la profilazione e la tracciatura degli scopi .

Problemi correlati