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


12

perf record -g在x86-64 Linux上使用它来分析程序。libc或libstdc ++中的几个符号0作为父代:例如__GI___strcmp_ssse3(libc)和strcmp@plt(libstdc ++)。(我实际上可以在调试器中中断这些符号并获得回溯。)

我很想知道这些函数的主要调用者是什么,以及为什么不记录它们。这是因为libc和libstdc ++在x86_64上没有帧指针吗?而且,实际上,是否有解决方法?

Answers:


5

这是一个古老的问题,但是现在可以实现--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上,性能与libdw链接。


perf record --call-graph dwarf为我解决了这个问题。不幸的是,当使用矮人信息时,性能似乎似乎无法显示基于调用者的(即“倒置”)调用图。这就是为什么我开始使用FlameGraph进行可视化的原因。
蓝色

请注意,使用矮化展开会在分析过程中造成非常大的开销
Azsgy

-2

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.