perf 报告函数名称和额外字符

Posted

技术标签:

【中文标题】perf 报告函数名称和额外字符【英文标题】:perf report function names and extra characters 【发布时间】:2015-09-09 00:03:17 【问题描述】:

我使用perf 分析了一个应用程序,我很困惑为什么报告中的函数名称如此混乱。比如这里是perf report的输出:

# Overhead      Command      Shared Object                                                                                                 
# ........  ...........  .................  .................................................................................................................................................................................................
#
    38.98%  hello_sp_tp  libc-2.19.so       [.] __memcpy_sse2_unaligned                                                                                                                                                                      
            |
            --- __memcpy_sse2_unaligned
               |          
               |--21.70%-- _ZN5nupic10algorithms6Cells46CStateaSERKS2_.local.1629
               |          
                --17.28%-- _ZN5nupic10algorithms6Cells46Cells420updateInferenceStateERKSt6vectorIjSaIjEE
                          _ZN5nupic10algorithms6Cells46Cells47computeEPfS3_bb

例如,我认识名称nupic.algorithms.Cells4.updateInferenceState(),但我不确定填充名称的所有其他字符是什么意思。

_ZN5 是什么?这个函数名末尾的IjSaIjEE 是什么?这些是什么意思?他们来自哪里?

【问题讨论】:

【参考方案1】:

这些(C++ 函数)名称是错位的。查看name mangling 了解语法详细信息。这允许对复杂的 C++ 命名进行编码。

关于您的 perf 报告,有一些选项可以要求解构:--demangle,理论上默认设置,但实际实现可能取决于 perf 版本或您的 CPU 架构。

【讨论】:

是的,我对此感到困惑,因为我从 perf 手册页中了解到 --demangle 是默认设置的,但我仍然看到名称修改。我需要为 GCC 设置任何选项以促进名称分解吗? @mateja 在 GCC 级别无事可做。拆解由 perf 完成。我看不出这可能取决于拱门的直接可见原因,但我在 ARM64 上看到了一个解构错误。如果您真的想在不修复 perf 的情况下进行 demangle,您可以编写一个脚本来对报告进行后处理,即使不是很方便。该脚本可以调用c++filt,这是一个可以翻译的命令,例如c++filt_ZN5nupic10algorithms6Cells46Cells47computeEPfS3_bb将给出nupic::algorithms::Cells4::Cells4::compute(float*, float*, bool, bool)【参考方案2】:

perf 可能是在不支持在您的系统上进行拆解的情况下构建的。

如果您的系统是 Ubuntu,请查看此处: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1396654 以及此处提供的解决方法: perf enable demangling of callgraph

【讨论】:

以上是关于perf 报告函数名称和额外字符的主要内容,如果未能解决你的问题,请参考以下文章

函数的一些基本知识

perf + 火焰图分析程序性能

[转]perf + 火焰图分析程序性能

#ex8 C语言标准实验报告

在Python中使用字符串调用函数

Python 函数名中允许的字符