ELFバイナリがgprofインストルメンテーションでビルドされたかどうかを検出しますか?


11

特定のプログラムがGNU gprofインストルメンテーションでコンパイルされているかどうか、つまりファイルを生成するかどうかを確認するために実行せずに、コンパイラとリンカーの両方に '-pg'フラグが渡されているかどうかを確認gmon.outできますか?

回答:


10

関数への参照をチェックすることができますmcount(またはおそらく、_mcountまたはプロファイリングの実装__mcountに従って)。この関数は、プロファイリングが機能するために必要であり、プロファイルされていないバイナリには存在しないはずです。

何かのようなもの:

$ readelf -s someprog | egrep "\s(_+)?mcount\b" && echo "Profiling is on for someprog"

上記はここで簡単なテストを行っています。


2

上記の答えの正規表現は常に機能するとは限りません...しかし、「readelf -s [binary]」の出力で「mcount」のgreppingの一般的な考え方は正しいと思います


0

答えにさらに追加:

  1. インストルメンテーションを確認するには、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    
    
  2. -pgフラグを付けてリンクするだけでなく、コンパイルする必要gmon.outがあります。そうしないと生成されません。stackoverflowリンク。

  3. フラグgmon.outを付けてコンパイル/リンクしているにもかかわらず、gprofを実行しているバイナリでファイルが生成されないことがわかりました -pg。その理由は-私は自分のアプリケーションを殺していた、それはきれいな出口ではなかった。gprofプログラムが正常に終了したときにのみ出力を生成します。Stackoverflowリンク

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.