perf输出中的奇怪字符......

bur*_*tor 2 c++ linux perf

我正在尝试使用符号编译的Linux perf调试webkit构建.

"perf report -g"的输出具有半人类可读符号和另一半字母数字值.

例如:

_ZN7WebCore12RenderObject18setAnimatableStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE
    |
    |--91.30%-- _ZN7WebCore4Node14setRenderStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE
    |          _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE
    |          _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE
    |          _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE
Run Code Online (Sandbox Code Playgroud)

这里发生了什么事?

什么是_ZN7?

我的预感是这与C++有关,也许我需要编译更多的选项来使符号正确地表示为perf.

这里的任何指针将不胜感激.我在文档中的任何地方都找不到任何相关内容.

Joe*_*e Z 6

这些是所谓的"受损名称":C++编译器将类型信息编码为符号名称,以便链接器可以正确实现重载,类作用域和命名空间,而无需实际理解C++类型系统,也无需支持外部字符基本的字母数字和下划线.

您可以使用c++filtLinux 等工具将这些名称转换为人类可读的名称.

例如:

$ echo _ZN7WebCore12RenderObject18setAnimatableStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE | c++filt 
WebCore::RenderObject::setAnimatableStyle(WTF::PassRefPtr<WebCore::RenderStyle>)
Run Code Online (Sandbox Code Playgroud)

或者在你的情况下,perf report -g | c++filt可能会做你想要的.