2009-12-03 6 views
19

Sto lavorando su ambiente Linux. Ho due pacchetti sorgente "C" treno e test_train.gprof: Come generare un call graph per le funzioni nella libreria condivisa collegata al programma principale

  1. pacchetto treno quando compilato genera libtrain.so
  2. link test_train a libtrain.so e genera eseguibile treno-test

Ora voglio generare un grafico chiamata utilizzando gprof che mostra chiamando sequenza di funzioni nel programma principale come pure all'interno di libtrain.so

Sto compilando e collegando entrambi i pacchetti con l'opzione -pg e il livello di debug è o0. Dopo aver effettuato ./train-test, viene generato gmon.out. Poi faccio:

$ gprof -q ./train-test gmon.out 

Qui, spettacoli di uscita chiamano grafico di funzioni in treno-test ma non in libtrain.so

Quale potrebbe essere il problema?

risposta

17

gprof non funziona, è necessario utilizzare sprof invece. Ho trovato i seguenti link:

Sommario dal 2 link:

  1. Compilare la libreria condivisa (libmylib.so) in debug (-g) modalità. No -pg.
  2. export LD_PROFILE_OUTPUT = `pwd`
  3. export LD_PROFILE = libmylib.so
  4. rm -f $ LD_PROFILE.profile
  5. esegua il programma che carica libmylib.so
  6. sprof path-to-LIB/$ LD_PROFILE $ LD_PROFILE.profile -p> log
  7. Vedere il registro.

Ho scoperto che nel passaggio 2, deve essere una directory esistente, altrimenti viene visualizzato un avviso utile. E nel passaggio 3, potrebbe essere necessario specificare la libreria come libmylib.so.X (forse anche .X.Y, non è sicuro) - altrimenti non si ottiene alcun avviso di sorta.

+0

Vale la pena notare che spesso è possibile capire quale sia il nome della libreria che il file binario sta tentando di caricare (mylib.so vs mylib.so.1 vs mylib.so.1.1 ecc.) Eseguendo 'ldd' sull'applicazione . Questo dovrebbe solo non avere una voce se la biblioteca viene aperta tramite una chiamata diretta dlopen. –

+1

troppo brutto sprof si blocca piuttosto male, come in [questa domanda] (http://stackoverflow.com/questions/6216979/what-is-causing-sprof-to-complain-about-inconsistency-detected-by-ld-so) –

+0

Cosa succede se lo sprof non viene fornito con MinGW, il compilatore scelto per il mio progetto? – Charles

0

Se non si è su Linux (come me su Solaris) si è semplicemente sfortunati perché non c'è lo sprof lì. Se hai i sorgenti del tuo grimorio puoi risolvere il tuo problema collegando una libreria statica e creando il tuo binario di profilazione con quello. Un altro modo in cui riesco a rintracciare le chiamate alle librerie condivise, è usando truss. Con l'opzione -u [!]lib,...:[:][!]func, ... si può ottenere una buona immagine della cronologia delle chiamate di una corsa. Non è completamente uguale alla profilazione, ma può essere molto utile in alcuni scenari.

1

Sto caricando la mia libreria da Python e non ho avuto fortuna con sprof.Invece, ho usato oprofile, che era nei repository di Fedora, almeno:

operf --callgraph /path/to/mybinary

Attendere che l'applicazione per terminare o fare Ctl-c per fermare profiling. Ora cerchiamo di generare un sommario profilo:

opreport --callgraph --symbols

Vedere il documentation di interpretarlo. È un po 'un casino. Nel rapporto generato, ogni simbolo è elencato in un blocco a sé stante. Il simbolo principale del blocco è quello che non è rientrato. Le voci sopra di esso sono funzioni che chiamano quella funzione, e quelle sotto di esso sono le cose che vengono chiamate da essa. Le percentuali nella sezione seguente sono la quantità relativa di tempo trascorso in quelle calle.