在perf profiler中调用堆栈

ere*_*ezz 25 linux profiling perf

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

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

perf report --call-graph --stdio
Run Code Online (Sandbox Code Playgroud)

然后,我看到了这个:

 1.60%     my_binary  my_binary                [.] my_func
           |
           --- my_func
              |          
              |--71.10%-- (nil)
              |          (nil)
              |          
               --28.90%-- 0x17f310000000a
Run Code Online (Sandbox Code Playgroud)

我看不出哪个函数调用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.

小智 25

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

  • 或尝试`perf record --call-graph dwarf`(没有帧指针的情况下工作) (14认同)

hol*_*eek 14

你几乎就在那里,你错过了这个-G选项(你可能需要一个比你系统上安装的更新的性能):

$ perf report --call-graph --stdio -G
Run Code Online (Sandbox Code Playgroud)

来自perf help report:

   -G, --inverted
       alias for inverted caller based call graph.
Run Code Online (Sandbox Code Playgroud)

  • 请注意,`perf record`(而不是`report`)上的`-G` 由cgroup 选择,以防有人对cgroups 产生混淆错误。 (3认同)
  • -G 只是更改“性能报告”中调用堆栈打印的顺序;如果在执行“perf record”时没有将完整的调用堆栈记录到“perf.data”,则“-G”选项将无济于事。只需启用帧指针或 dwarf(可能未移植到 rh 的 2.6.32)即可在“记录”时解码帧:http://www.brendangregg.com/perf.html#StackTraces “省略帧指针是一个破坏调试器的邪恶编译器优化” (2认同)