2014-11-23 11 views
6

Ho compilato un codice con gcc utilizzando il flag di profiling (-pg), ma quando eseguo il programma non viene generato gmon.out.
Ho compilato un codice di prova - in realtà, quello da this domanda - per vedere se il flag di compilazione & gprof stavano lavorando e, sì, ha funzionato.Il codice compilato con il flag di profiling non genera gmon.out

Per compilare il codice (denominato xrttimetag) la seguente riga è stato utilizzato (qui di seguito ho usato -I(...) e -L(...) per nascondere una lista enorme di percorsi per altre biblioteche scientifiche):

gcc -c -o ./xrttimetag.o -Wall --pedantic -Wno-comment -Wno-long-long -pg -fPIC -I(...) -DPACKAGE_NAME="" -DPACKAGE_TARNAME="" -DPACKAGE_VERSION="" -DPACKAGE_STRING="" -DPACKAGE_BUGREPORT="" -DPACKAGE_URL="" -Dg77Fortran=1 -DgFortran=1 -DHAVE_CONNECT=1 -DHAVE_ACCEPT=1 -DSTDC_HEADERS=1 -DHAVE_SYS_TYPES_H=1 -DHAVE_SYS_STAT_H=1 -DHAVE_STDLIB_H=1 -DHAVE_STRING_H=1 -DHAVE_MEMORY_H=1 -DHAVE_STRINGS_H=1 -DHAVE_INTTYPES_H=1 -DHAVE_STDINT_H=1 -DHAVE_UNISTD_H=1 -DHAVE_LIBM=1 -DHAVE_LIBDL=1 -DHAVE_LIBNCURSES=1 -DSIZEOF_LONG=8 xrttimetag.c 

gcc -o xrttimetag xrttimetag.o  -L(...) -lswxrt -latFunctions3.3 -lcoordfits -lcoord -lephemeris -lhdinit_2.7 -lhdutils_2.7 -lape_2.8 -lcfitsio_3.37 -lreadline -lhdio_2.7 -lncurses -ldl -lm -L/usr/lib64/gcc/x86_64-suse-linux/4.6 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../.. -L/usr/lib64/gcc/x86_64-suse-linux/4.6 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../lib64 -L/lib/../lib64 -L/usr/lib/../lib64 -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../../../x86_64-suse-linux/lib -L/usr/lib64/gcc/x86_64-suse-linux/4.6/../../.. -lgfortran -lm -lgcc_s -lgcc -lquadmath -lm -lgcc_s -lgcc -lc -lgcc_s -lgcc 

ho cercato relativi simboli per gmon sulla generati binario e si guardano un po 'strano per me perché sono indefiniti:

readelf -s `which xrttimetag` | egrep "gmon|mcount" 
21: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
74: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (2) 
41: 000000000040267c  0 FUNC LOCAL DEFAULT 15 call_gmon_start 
96: 0000000000000000  0 NOTYPE WEAK DEFAULT UND __gmon_start__ 
166: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 

sulla ot la sua mano, il codice test, ho compilato con:

g ++ -pg test.cpp

E la ricerca per "gmon | mcount" simboli mi danno:

readelf -s test | egrep "gmon|mcount" 
6: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]_2.2.5 (3) 
11: 0000000000400850 63 FUNC GLOBAL DEFAULT 15 __gmon_start__ 
40: 0000000000000000  0 FILE LOCAL DEFAULT ABS gmon-start.c 
43: 0000000000400890  0 FUNC LOCAL DEFAULT 15 call_gmon_start 
73: 0000000000400850 63 FUNC GLOBAL DEFAULT 15 __gmon_start__ 
91: 0000000000000000  0 FUNC GLOBAL DEFAULT UND [email protected]@GLIBC_2.2.5 

Noi può che i simboli "gmon" siano ben definiti per il codice _ test_ e non per il _ xrttimetag_, ma non capisco davvero perché. Cosa mi manca?

Grazie.

PS: ho visto la domanda gmon.out is not written after compiling with gcc -pg -g e questa non è una duplicazione, a meno che non avessi completamente frainteso quella.

+2

Ho avuto lo stesso identico problema .. Eccellente descrizione del problema e risposta! – brokenfoot

risposta

12

Non si sta passando -pg durante la generazione di file eseguibili.

cioè

gcc -o xrttimetag xrttimetag.o .... 

Si dovrebbe passare -pg opzione anche qui. Posso ri-produrre il problema (cioè i simboli non sono definiti per le chiamate di gmon *) se utilizzo -pg durante la compilazione ma non durante il collegamento.

Dal gcc documentation:

-pg

Generare codice aggiuntivo per scrivere le informazioni del profilo adatto per il programma gprof analisi. È necessario utilizzare questa opzione quando si compilano i file di origine di cui si desiderano i dati e si deve anche utilizzarli quando si collega il collegamento .

+0

Perfetto. Grazie! Solo per completare la risposta: nel mio caso, dove sto usando il buon vecchio GNU Make e non volevo modificare i makefile, il flag "-pg" è stato aggiunto al processo hold tramite la (variabile d'ambiente) CFLAGS (per la generazione dell'oggetto (.o)) e LDFLAGS per la fase di collegamento. – Brandt

Problemi correlati