【问题标题】:Call stack in the perf profiler性能分析器中的调用堆栈
【发布时间】:2012-08-23 00:44:58
【问题描述】:

我正在通过以下方式运行“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。

【问题讨论】:

    标签: linux profiling perf


    【解决方案1】:

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

    【讨论】:

    • 或尝试perf record --call-graph dwarf(无需帧指针即可)
    • 为您分析的代码安装 debuginfo 包,大多数时候您需要 glibc,即 debuginfo-install glibc
    • 所以,perf record --call-graph dwarf 不起作用(对我来说),并积极防止记录一个呼叫图,即使是用 -fno-omit-frame-pointer 编译的……我花了很多时间和头发拉在我意识到我必须通过perf record --call-graph fp 获取通话记录之前!
    【解决方案2】:

    您快到了,您缺少-G 选项(您可能需要比系统上安装的更新的性能):

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

    来自perf help report

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

    【讨论】:

    • -G 只是改变perf report 中调用堆栈打印的顺序;如果在perf record 时没有记录到perf.data 的完整调用堆栈,-G 选项将无济于事。只需要在record:brendangregg.com/perf.html#StackTraces“省略帧指针是破坏调试器的邪恶编译器优化”时启用帧指针或dwarf(可能未移植到rh的2.6.32)解码帧”
    • 请注意,-G on perf record(而不是report)由 cgroup 选择,以防任何人对 cgroup 产生混淆错误。
    猜你喜欢
    • 2016-12-14
    • 2018-08-11
    • 1970-01-01
    • 2020-04-20
    • 2013-03-04
    • 2016-10-21
    • 2012-12-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多