2

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

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

例如:

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

这里发生了什么事?

什么是_ZN7?

我的预感是这与 C++ 有关,也许我需要使用更多选项进行编译,以使符号在 perf 中正确表示。

这里的任何指针将不胜感激。我在文档中的任何地方都找不到有关此的任何信息。

4

1 回答 1

6

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

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

例如:

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

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

于 2013-11-20T00:09:46.167 回答