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 报告函数名称和额外字符的主要内容,如果未能解决你的问题,请参考以下文章