我正在尝试使用我用符号编译的Linux perf调试webkit构建。
“perf report -g”的输出具有半人类可读符号和另外一半字母数字值。
例如:
_ZN7WebCore12RenderObject18setAnimatableStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE
|
|--91.30%-- _ZN7WebCore4Node14setRenderStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE
| _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE
| _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE
| _ZN7WebCore7Element11recalcStyleENS_4Node11StyleChangeE
这里发生了什么?
什么是_ZN7?
我的预感是,这与C ++有关,也许我需要使用更多选项进行编译,以使符号在perf中正确表示。
这里的任何指针都将不胜感激。我在文档中的任何地方都找不到任何相关内容。
答案 0 :(得分:7)
这些是所谓的"mangled names":C ++编译器将类型信息编码为符号名称,以便链接器可以正确地实现重载,类作用域和命名空间,而无需实际理解C ++类型系统,并且无需支持基本字母数字和下划线之外的字符。
您可以使用Linux下的c++filt
等工具将这些名称转换为人类可读的名称。
例如:
$ echo _ZN7WebCore12RenderObject18setAnimatableStyleEN3WTF10PassRefPtrINS_11RenderStyleEEE | c++filt
WebCore::RenderObject::setAnimatableStyle(WTF::PassRefPtr<WebCore::RenderStyle>)
或者在你的情况下,perf report -g | c++filt
可能会做你想要的。