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++filtLinuxなどのツールを使用して、これらを人間が読める名前に戻すことができます。

例えば:

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

または、あなたの場合、perf report -g | c++filtおそらくあなたが望むことをするでしょう。

于 2013-11-20T00:09:46.167 に答える