性能分析器中的调用栈

33

我正在以下方式运行"perf":

perf record -a --call-graph -p some_pid

perf report --call-graph --stdio

然后,我看到了这个:

 1.60%     my_binary  my_binary                [.] my_func
           |
           --- my_func
              |          
              |--71.10%-- (nil)
              |          (nil)
              |          
               --28.90%-- 0x17f310000000a

我无法看到哪些函数调用了my_func()。我看到的是"nil"和"0x17f310000000a",这是怎么回事?我做错了什么吗?这可能不是一个调试信息问题,因为有些符号被显示而另一些则没有。

更多信息:

  • 我正在运行CentOS 6.2(内核版本为2.6.32-220.4.1)。
  • perf rpm - perf-2.6.32-279.5.2.el6.x86_64。

相关:Perf中的奇怪回溯 - 库通常通常是正常编译的,没有使用-fno-omit-frame-pointer,因此回溯的fp方法无法进入/通过它们的函数。对于libc6,perf record with --call-stack fp fails to unwind main function提到一些发行版具有带有帧指针编译版本的libc6-prof包,旨在与分析器一起使用。 - Peter Cordes
2个回答

35

请确保您使用 gcc-fno-omit-frame-pointer 选项编译代码。


34
或者尝试使用 perf record --call-graph dwarf (不需要帧指针)来记录性能。 - maxy
安装调试信息包以对您分析的代码进行调试,大多数情况下您需要glibc,即debuginfo-install glibc。 - Alec Istomin
所以,perf record --call-graph dwarf 对我来说不起作用,并且即使使用-fno-omit-frame-pointer编译,也会阻止调用图被记录,花费了我很多时间和头发才意识到我必须使用 perf record --call-graph fp 才能获得调用图! - Linas
sudo perf record --call-graph lbr <program_name> 这个命令适用于英特尔处理器,无需对程序进行特定的编译。 - Osman

19

你已经快成功了,只是缺少了-G选项(可能需要比系统上安装的版本更新的性能分析工具):

$ perf report --call-graph --stdio -G

来自 perf help report:

   -G, --inverted
       alias for inverted caller based call graph.

2
-G 仅仅改变了 perf report 中调用栈打印的顺序;如果在 perf record 时没有完整的调用栈记录到 perf.data 中,那么 -G 选项将无法帮助。只需要在 record 时启用帧指针或 dwarf(可能未移植到 rh 的 2.6.32 版本)以解码帧:http://www.brendangregg.com/perf.html#StackTraces "省略帧指针是一种恶意编译器优化,会破坏调试器"。 - osgx
4
请注意,在perf record命令中,选项-G(而不是-report)按cgroup进行选择,以防止任何人因cgroup而出现混淆错误。 - Craig Ringer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接