与えられたプログラムがGNU gprofツールを使ってコンパイルされたことを確認することは可能ですか?つまり、「-pg」フラグがコンパイラとリンカに渡されます。いいえgmon.out
実行してファイルが生成されることを確認しますか?
答え1
関数への参照を確認できますmcount
(可能または_mcount
基礎__mcount
として)。分析の実施)。この機能は分析が機能するために必要であり、分析されていないバイナリには存在しないでください。
それは次のとおりです。
$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"
上記はここでクイックテストに適用されます。
答え2
上記の答えの正規表現が常に機能するわけではありません...しかし、 "readelf -s [binary]"出力から "mcount"をgrepingする一般的なアイデアは正しいと思います。
答え3
答えにさらにコンテンツを追加する:
機器を確認するには、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
ビルドされません。スタックオーバーフローリンク。gmon.out
フラグを使用してコンパイル/リンクしても、バイナリでgprofを実行するとファイルが生成されないことがわかりました-pg
。その理由は - 申請書を終了しようとしても完全に終了しないからです。gprof
プログラムが正常に終了した場合にのみ出力が生成されます。スタックオーバーフローリンク