libcおよびlibstdc ++シンボルに対してLinuxの「パフォーマンスロギング」が機能するようにするにはどうすればよいですか?

libcおよびlibstdc ++シンボルに対してLinuxの「パフォーマンスロギング」が機能するようにするにはどうすればよいですか?

私はperf record -gプログラムプロファイリングにx86-64 Linuxを使用しています。 libc または libstdc++ の複数のシンボルを0親シンボルとして使用します (例: __GI___strcmp_ssse3(libc) や (libstdc++))。strcmp@plt(実際には、デバッガでこれらのシンボルを分析することでバックトレースを得ることができます。)

これらの関数の主要な呼び出し元が何であるか、なぜ記録されないのかを知りたいです。 libcとlibstdc ++にx86_64にフレームポインタがないからですか?そして、もっと現実的にこの問題を解決する方法がありますか?

ベストアンサー1

これは古い質問ですが、今すぐ--call-graph dwarfマニュアルページで解決できます。

 -g
       Enables call-graph (stack chain/backtrace) recording.

   --call-graph
       Setup and enable call-graph (stack chain/backtrace) recording, implies -g.

           Allows specifying "fp" (frame pointer) or "dwarf"
           (DWARF's CFI - Call Frame Information) as the method to collect
           the information used to show the call graphs.

           In some systems, where binaries are build with gcc
           --fomit-frame-pointer, using the "fp" method will produce bogus
           call graphs, using "dwarf", if available (perf tools linked to
           the libunwind library) should be used instead.

私はこれが最新のLinuxカーネル(> = 3.9?不明)が必要だと思います。ディストリビューションのパフォーマンスパッケージがlibdwまたはlibunwindに関連付けられていることを確認できますreadelf -d $(which perf) | grep -e libdw -e libunwind。 Fedora 20では、perfはlibdwに関連付けられています。

おすすめ記事