2011-10-20 13 views
3

SystemTapプローブを使用してオーバーロードされたメソッドを区別するにはどうすればよいですか?SystemTapを使用してオーバーロードされたC++メソッドのプロファイリング

など。 .stpファイルで

class A { 
// ... 
void doFoo(); 
void doFoo(int a); 
// ... 
}; 

probe process("foobar").function("A::doFoo<NO ARGS>").return { 
    // do something 
} 
probe process("foobar").function("A::doFoo<USING INT>").return { 
    // do something different 
} 

は、それが.statement(@file:line)を使用して価値があるではないですので、両方の方法が十分に複数の戻りポイントを有することができることを検討してください。

+0

マングルされた関数名で試しましたか? – crazyjul

+0

'ldd'によって返された変更された名前で何の効果もないと試しました。しかし、各コンパイラはそのマングリング推論について自由であるため、イベントは移植可能ではありません。 – milton

答えて

5

stap 1.4以降では、少なくともdebuginfoで記述されていれば、マングルされた名前を調べる必要があります。私はあなたの例でテストプログラムを構築し、それぞれ "_ZN1A5doFooEv"と "_ZN1A5doFooEi"がvoidとintの場合に働いていました。それは、しかし、正しいMIPS_linkage_nameを書くコンパイラに依存します。時にはシンボルテーブルからも動作することがありますが、コンパイラが生成した関数の最適化されたバージョンをすべてカバーしているとは限りません。

発見されたすべての名前を表示するには、stap -l 'process("foobar").function("_Z*")'を試してください。ワイルドカードでは、_Zは、名前の変更をトリガするために必要です。

stapがプローブポイントを見つけても、期待通りに発射されないようであれば、コンパイラが複数のバージョンの関数をインラインで出力している可能性があります。試してみると、stapが見つけた.call、.inline、.returnのバリエーションを見るには、stap -l 'process("foobar").function("_Z*").*'を試してみてください。 .returnプローブはインラインでは機能しないので、呼び出しインスタンスにのみ対応していることに注意してください。

@file:line構文は、行を含む関数を見つけるためにも機能するので、これを使用して.statementプローブだけでなく、function.returnもアンカーすることができます。この場合、すべてのリターンポイントについて心配する必要はありません。関心のある関数内の任意の行を選択するだけで、すべてのリターン命令がトラップされます。 (これは、あなたがインラインを扱っていないことを前提としています)

関連する問題