如何使 Linux 的“性能记录”适用于 libc 和 libstdc++ 符号?

如何使 Linux 的“性能记录”适用于 libc 和 libstdc++ 符号?

我正在perf record -gx86-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?我不完全确定)。您可以检查您的发行版的 perf 包是否与 libdw 或 libunwind 链接readelf -d $(which perf) | grep -e libdw -e libunwind。在 Fedora 20 上,perf 与 libdw 链接。

答案2

perf是一个显示系统调用所用时间的内核工具。您正在寻找 GNU gprof。 “gprof - 显示调用图配置文件数据”。要使用 gprof,您需要使用开关编译源代码-pg

除此之外,还有许多复杂的分析工具,例如eclipse-cdt-profiling-framework.

相关内容