2009-06-23 16 views
23

Sto provando a profilare un'applicazione C++ con gprof su una macchina che esegue OSX 10.5.7. Io compilo con g ++ nel solito modo, ma usando i flag -pg, eseguo l'applicazione e provo a visualizzare il grafo delle chiamate con gprof.gprof non riporta il tempo accumulato

Sfortunatamente il mio grafico di chiamata contiene tutti gli zeri per tutte le colonne di tempo. I valori nelle colonne "chiamate" hanno valori ragionevoli, quindi sembra che qualcosa sia stato profilato, ma sono sconcertato dalla mancanza di altri dati.

Tutti i miei file di origine vengono compilati in modo simile:

g++ -pg -O2 -DNDEBUG -I./ -ansi -c -o ScenarioLoader.o ScenarioLoader.cpp 

ho quindi eseguire 'Ar' per raggruppare tutti i file oggetto in una libreria. Più tardi, collego e corro gprof come così:

g++ -pg -lm -o vrpalone vrpalone.o ../src/atomicprof.a lastbuild.o 
./vrpalone 
gprof gmon.out | less 

Tutte le idee?

+0

** gprof ** è in circolazione dal 1982. Da allora, la progettazione di computer e lingue ha fatto enormi progressi, ma la nostra comprensione collettiva dei problemi di prestazioni è progredita molto poco.Parliamo ancora approssimativamente degli stessi concetti introdotti da ** gprof ** e non abbiamo cercato di comprenderli veramente. [Ecco una discussione e presentazione di alcune idee più recenti.] (Https://stackoverflow.com/questions/1777556/alternatives-to-gprof/1779343#1779343) –

risposta

5

Ho pensato che potrei condividere this Apple mailing list discussion che ho incontrato di recente.

Il comportamento descritto qui è esattamente quello che sto vivendo. Sembra che gprof sia stato interrotto su OSX per un bel po 'di tempo.

Ho fatto ricorso a Squalo che è stato utilmente suggerito da Dave Rigby.

Grazie!

11

Se il programma termina in modo non pulito, i dati del profilo non verranno scritti correttamente: come si sta chiudendo il programma?

Indipendentemente da ciò, mi consiglia vivamente di utilizzare Shark invece di gprof - è molto facile da usare e superiore in quasi tutti i modi di gprof - e non richiede di ricompilare il programma.

+0

Ciao Dave. Il mio programma termina in modo pulito. Ho dato un'occhiata a Shark e mentre funziona sembra che non riesca a farlo generare un profilo piatto. C'è un'opzione di appiattimento che ho trovato ma non mostra le stesse informazioni di gprof che è deludente; idealmente vorrei che tutte le funzioni con lo stesso nome fossero aggiunte insieme. Inoltre, non riesco a far visualizzare a Shark il numero di chiamate a ciascuna funzione. – Daniel

+0

Ho trovato l'opzione "visualizzazione pesante" per risolvere il problema di appiattimento. Ancora non riesco a vedere un bel modo di visualizzare il numero di chiamate. Oh bene. Penso di averne abbastanza! Saluti per l'aiuto Dave. – Daniel

+0

+1 forte per lo squalo. Batte gprof o Google Perf Tools durante lo sviluppo su OSX. È possibile visualizzare il numero esatto di campioni selezionando una determinata riga. Quindi mostra il numero di campioni per quella funzione in basso. Raramente è utile, visto che il% è ciò che è utile. – Tristan

2

Quanto velocemente funziona il programma? Se è estremamente veloce, potrebbe essere troppo veloce per effettivamente il profilo. Ho avuto questo problema con un programma di elaborazione del testo molto semplice: quando l'ho eseguito con il mio file di test sub-1kb riportava tutti gli 0 nelle colonne del tempo. L'ho risolto eseguendo l'intero testo di The Great Gatsby attraverso di esso. Prova un set di dati più grande o esegui il calcolo del calcolo principale alcune centinaia di volte.

+0

Ciao psanf. Il mio programma funziona per un po 'di tempo a seconda dell'input che gli ho dato (risolve vari problemi di commesso viaggiatore). Ho provato a profilarlo usando un piccolo problema che coinvolge 318 città che richiede circa 30 secondi per risolverlo. – Daniel

2

Il programma utilizza più thread? Ho riscontrato questo problema con i programmi multithread su Linux, non so se OS X avrebbe gli stessi problemi

Ecco un numero solution per il problema del multithreading che ho usato con successo in passato.

+0

Ciao bklock. Il mio programma è solo filettato al momento. Terrò in mente quel collegamento però! – Daniel

2

Forse non rilevante per la domanda dell'OP, c'è uno scenario comune in cui "non si accumula tempo": se il tuo codice chiama il kernel o chiama librerie non compilate con -pg, non vedrai il tempo accumulato per il tempo speso Là.

2

Btw, hai forchetta() nel tuo codice? Se è così, aggiungere questo nel processo figlio subito dopo il fork():

extern void _start (void), etext (void); 
monstartup ((u_long) &_start, (u_long) &etext); 

che ha fatto il trucco per me.

Problemi correlati