gprof rapporti di nessun tempo cronometrato

Sto cercando di profilo di un’applicazione C++ con gprof su una macchina con sistema operativo OSX 10.5.7.
Compila con g++ nel solito modo, ma utilizzando -pg bandiere, eseguire l’applicazione e provare a visualizzare il grafo delle chiamate con gprof.

Purtroppo il mio grafo contiene tutti zeri per tutte le colonne. I valori della “chiamata” colonne di valori ragionevoli in modo che appaia come qualcosa che è stato profilato ma io 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.
In seguito, I link ed eseguire gprof così:

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

Tutte le idee?

InformationsquelleAutor Daniel | 2009-06-23

 

7 Replies
  1. 11

    Se il programma termina in modo non modo pulito quindi i dati del profilo non avere scritto correttamente – come è il vostro programma di uscire?

    A prescindere, mi piacerebbe consiglia di utilizzare Shark invece di gprof – è molto facile da usare e superiore in praticamente ogni modo per gprof – e non ha bisogno di ricompilare il programma.

    • Ciao Dave. Il mio programma termina correttamente. Ho dato un’occhiata a Shark e mentre fa il lavoro che ho non riesco a fare è generare un profilo piatto. C’è un appiattimento opzione che ho trovato ma non visualizzare le stesse informazioni come gprof che è deludente; idealmente mi piacerebbe che tutti funzioni con lo stesso nome aggiunto insieme. Anche io non riesco a fare Squalo visualizzare il numero di chiamate per ogni funzione.
    • Ho trovato “pesante view” opzione per risolvere l’appiattimento problema. Ancora non riesco a vedere un bel modo di visualizzazione del numero di chiamate. Oh, bene. Credo di avere abbastanza! Applausi per l’aiuto di Dave.
    • Forte +1 per lo Squalo. Batte gprof o Google Perf Strumenti quando si sviluppa su OSX. Si può vedere il numero esatto dei campioni selezionando una determinata riga. Essa mostra il numero di campioni per quella funzione sul fondo. Raramente è utile però dato che la % è cosa utile.
  2. 5

    Ho pensato di condividere questo Apple mailing list di discussione che ho recentemente imbattuto in.

    Il comportamento descritto è esattamente quello che sto vivendo.
    Sembra che gprof è stato rotto su OSX per un bel po ‘ di tempo.

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

    Grazie!

  3. 2

    Quanto velocemente il vostro programma in esecuzione? Se la sua molto veloce, potrebbe essere troppo veloce per realtà profilo. Ho avuto questo problema con un semplice programma di videoscrittura: quando l’ho fatto con il mio sub-1kb file di prova ha tutte le 0 le colonne dell’ora. Ho risolto eseguendo per intero il testo di Il Grande Gatsby attraverso di essa. Provare un set di dati più grandi o un ciclo principale di calcolo centinaia di volte.

    • Ciao psanf. Il mio programma viene eseguito per un bel po ‘ di tempo a seconda dell’input ho dato (che non risolve i vari traveling salesman problemi). Ho provato profilazione usando un piccolo problema che coinvolge 318 città che prende ~30 secondi per risolvere.
    • Considerare il tempo di campionamento. Se non c’è alcuna funzione attiva più a lungo di default samping tempo, 0,01 secondi, questo potrebbe risultare in nessun campionato i dati rilevati. Vedi anche in questo MODO link.
  4. 2

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

    Qui è un soluzione per il multithreading problema che ho usato con successo in passato.

    • Ciao bklock. Il mio programma è solo singolarmente filettato al momento. Continuerò a quel link in mente!
  5. 2

    Forse non rilevanti per l’OP è domanda, c’è uno scenario comune in cui “non c’è tempo accumulato” succede: se il codice chiama il kernel o chiamate librerie non è compilato con -pg, non si vede alcun tempo cronometrato, per il tempo trascorso lì.

  6. 2

    Btw, ti fork() nel codice?
    Se è così, aggiungere questo il processo figlio solo dopo la fork():

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

    Che ha fatto il trucco per me.

  7. 0

    la precisione del tempo in gprof è 0.00. quindi, forse, il modulo si impiega meno tempo
    (milli sec/micro sec).Quindi, mostrerà 0.00 e non c’è tempo accumulato.Quindi, eseguire l’intero programma su 1000/1000000 times in modo che si arriverà a secondi.Infine, dividere il tempo ottenuto con il loop fattore (1000/1000000) e che sta per essere il vostro tempo di elaborazione. Anch’io ho dovuto affrontare lo stesso problema e facendo questo si ottiene risolto.

    • Spero che tu capisca che si sono ha risposto a una domanda che è di circa 9 anni ormai, e la questione dell’autore del più probabilmente risolto il problema o semplicemente morto di vecchiaia (fu visto l’ultima volta qui in S. O. nel 2017). A parte questo, quello che stai suggerendo come una soluzione alla questione è un duplicato di ciò che è scritto nell’ultima parte del psanf la risposta.

Lascia un commento