perf输出中奇怪的字符…

我正在尝试使用符号编译的Linux perf来debuggingwebkit版本。

“perf report -g”的输出具有半人可读的符号和另一半的字母数字值。

例如:

_ZN7WebCore12RenderObject18setAnimatableStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE | |--91.30%-- _ZN7WebCore4Node14setRenderStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE | _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE | _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE | _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE 

这里发生了什么事?

什么是_ZN7?

我的直觉是,这是与C + +做的事情,也许我需要编译更多的选项,以正确表示符号。

任何指针在这里将不胜感激。 在文档中的任何地方我都找不到任何东西。

这就是所谓的“mangled names” :C ++编译器将类型信息编码为符号名称,这样链接器就可以正确地实现重载,类作用域和命名空间,而不必真正理解C ++类型的系统,并且不需要支持外部字符基本的字母数字和下划线。

您可以使用Linux下的c++filt等工具将这些名称转换为人类可读的名称。

例如:

 $ echo _ZN7WebCore12RenderObject18setAnimatableStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE | c++filt WebCore::RenderObject::setAnimatableStyle(WTF::PassRefPtr<WebCore::RenderStyle>) 

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