我使用profiling标志(-pg
)编译了一个带gcc的代码,但是当我运行程序时,没有生成gmon.out。
我编译了一个 test 代码 - 实际上是来自this问题的代码 - 以查看编译标记& gprof正在工作,是的,它有效。
要编译代码(名为xrttimetag
),使用了以下行(下面我使用了-I(...)
和-L(...)
来隐藏其他科学库的大量路径): / p>
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
我在生成的二进制文件上查找了与gmon
相关的符号,因为它们未定义,它们对我来说有点奇怪:
readelf -s `which xrttimetag` | egrep "gmon|mcount"
21: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__
74: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_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 mcount@@GLIBC_2.2.5
另一方面,我编译了test代码:
g ++ -pg test.cpp
搜索" gmon | mcount"符号给我:
readelf -s test | egrep "gmon|mcount"
6: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_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 mcount@@GLIBC_2.2.5
我们可以说" gmon"符号是为_ test_代码定义的,而不是_ xrttimetag_,但我不明白为什么。我错过了什么?
感谢。
PS:我看到问题gmon.out is not written after compiling with gcc -pg -g,这个问题不是重复,除非我完全误解了那个问题。
答案 0 :(得分:17)
生成可执行文件时,您没有传递-pg
。
即
gcc -o xrttimetag xrttimetag.o ....
您也应该在此处传递-pg
选项。如果我在编译时使用-pg
但在链接时不使用{{1}},我可以重新产生问题(即gmon *调用的符号未定义)。
-pg
生成额外的代码来编写适合的配置文件信息 分析程序gprof。编译时必须使用此选项 您想要数据的源文件,您还必须在使用它时使用它 联。