特定のプログラムがGNU gprofインストルメンテーションでコンパイルされているかどうか、つまりファイルを生成するかどうかを確認するために実行せずに、コンパイラとリンカーの両方に '-pg'フラグが渡されているかどうかを確認gmon.out
できますか?
特定のプログラムがGNU gprofインストルメンテーションでコンパイルされているかどうか、つまりファイルを生成するかどうかを確認するために実行せずに、コンパイラとリンカーの両方に '-pg'フラグが渡されているかどうかを確認gmon.out
できますか?
回答:
関数への参照をチェックすることができますmcount
(またはおそらく、_mcount
またはプロファイリングの実装__mcount
に従って)。この関数は、プロファイリングが機能するために必要であり、プロファイルされていないバイナリには存在しないはずです。
何かのようなもの:
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
上記はここで簡単なテストを行っています。
答えにさらに追加:
インストルメンテーションを確認するには、mcount / gmonのgrep:
$ readelf -s <binary> | egrep "gmon|mcount"
20: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
28: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@GLIBC_2.2.5 (2)
36: 0000000000000000 0 FILE LOCAL DEFAULT ABS gmon-start.c
39: 00000000004011a0 0 FUNC LOCAL DEFAULT 12 call_gmon_start
100: 0000000000401160 63 FUNC GLOBAL DEFAULT 12 __gmon_start__
114: 0000000000000000 0 FUNC GLOBAL DEFAULT UND mcount@@GLIBC_2.2.5
-pg
フラグを付けてリンクするだけでなく、コンパイルする必要gmon.out
があります。そうしないと生成されません。stackoverflowリンク。
フラグgmon.out
を付けてコンパイル/リンクしているにもかかわらず、gprofを実行しているバイナリでファイルが生成されないことがわかりました -pg
。その理由は-私は自分のアプリケーションを殺していた、それはきれいな出口ではなかった。gprof
プログラムが正常に終了したときにのみ出力を生成します。Stackoverflowリンク