web-dev-qa-db-ja.com

プロファイリングフラグを使用してコンパイルされたコードはgmon.outを生成しません

プロファイリングフラグ(_-pg_)を使用してgccでコードをコンパイルしましたが、プログラムを実行するとgmon.outが生成されません。
testコードをコンパイルしました-実際には、 this 質問-からのもので、コンパイルフラグとgprofは機能していましたが、はい、機能しました。

コード(xrttimetagという名前)をコンパイルするために、次の行が使用されました(以下では、-I(...)-L(...)を使用して、他の科学ライブラリへのパスの膨大なリストを非表示にしました) :

_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に関連するシンボルを探しましたが、undefinedであるため、少し奇妙に見えます。

_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」シンボルは、_xrttimetag_ではなく_test_コードに対して適切に定義されている可能性がありますが、その理由はよくわかりません。何が足りないのですか?

ありがとう。

PS:私は質問を見ました gmon.outはgcc -pg -gでコンパイルした後に書かれていません 、そして私がそれを完全に誤解していない限り、これは重複ではありません。

13
Brandt

実行可能ファイルを生成するときに-pgを渡していない。

つまり.

gcc -o xrttimetag xrttimetag.o ....

ここでも-pgオプションを渡す必要があります。コンパイル時に-pgを使用し、リンク時に使用しない場合、問題を再現できます(つまり、gmon *呼び出しに対してシンボルが定義されていません)。

gccドキュメント から:

-pg

分析プログラムgprofに適したプロファイル情報を書き込むための追加のコードを生成します。このオプションは、データが必要なソースファイルをコンパイルするときに使用する必要があります。また、リンクするときにも使用する必要があります。

18
P.P