2014-11-23 30 views
6

Profil bayrağı (-pg) kullanarak gcc ile bir kod derledim, ancak programı çalıştırdığımda gmon.out üretilmez.
Bir test kodunu derledim - aslında this sorusundan biri - derleme bayrağı & gprof'un çalışıp çalışmadığını görmek için, ve evet, işe yaradı.Profil bayrağı ile derlenen kod gmon.out oluşturmuyor

aşağıdaki satırı (ı diğer bilimsel kütüphanelere yolların büyük bir listesini gizlemek için -I(...) ve -L(...) kullanılan aşağıda) kullanılmıştır (xrttimetag adlandırılır) kodu derlemek için: Ben ilgili semboller için baktım

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 

üzerinde gmon ikili oluşturulan ve onlar tanımsız çünkü benim için biraz garip bak: ot Açık

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 

gr ++

Ve "gmon | mcount" için arama dekarboksi test.cpp semboller ver: eli, test kod, beraber derlenmiş

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 

Biz "gmon" sembollerinin _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ Neyi kaçırıyorum?

Teşekkürler.

Not: Bu sorunu tamamen yanlış anlamadıkça, gmon.out is not written after compiling with gcc -pg -g sorusunu gördüm ve bu bir çoğaltma değil.

+2

Tam olarak aynı sorun vardı .. Mükemmel sorun açıklaması & cevap! – brokenfoot

cevap

12

Yürütülebilir dosya oluştururken -pg geçmiyorsunuz.

yani

gcc -o xrttimetag xrttimetag.o .... 

Sen de burada -pg seçeneği geçmelidir. Bağlama yaparken değil, derleme yaparken -pg kullanırsam sorunu yeniden oluşturabilirim (yani, gmon * çağrıları için semboller tanımlanmamıştır). gcc documentation itibaren

:

dekarboksi

analiz programı gprof'ın için uygun profil bilgilerini yazmak için ekstra kod üretilir. Verileri istediğiniz kaynak dosyalarını derlerken bu seçeneği kullanmalısınız ve ayrıca bağlantı kurulduğunda da kullanmalısınız.

+0

Mükemmel. Teşekkürler! Sadece cevabı tamamlamak için: iyi bir eski GNU Makyajı'nı kullandığım ve maketleri değiştirmek istemediğim durumlarda, (-pg) bayrağı, (çevre değişkeni) CFLAGS aracılığıyla tutma sürecine eklendi. bağlantı aşaması için nesne (.o) üretimi) ve LDFLAGS. – Brandt