3

SystemTapプローブを使用してオーバーロードされたメソッドを区別するにはどうすればよいですか?

例えば

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

.stp ファイル内:

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)

4

1 に答える 1

5

stap 1.4 以降では、少なくとも debuginfo がそれらを記述している場合、マングルされた名前をプローブするために機能するはずです。私はあなたの例でテストプログラムを作成しました.「_ZN1A5doFooEv」と「_ZN1A5doFooEi」は、それぞれvoidとintの場合に機能しました. ただし、正しい MIPS_linkage_name を記述するのはコンパイラに依存します。シンボルテーブルからも機能する場合がありますが、コンパイラが生成した可能性のある関数の最適化されたすべてのバージョンを必ずしもカバーしているわけではありません。

検出されたマングル名をすべて表示するには、 を試してくださいstap -l 'process("foobar").function("_Z*")'。マングルされた名前の処理をトリガーするには、ワイルドカードに _Z が必要です。

stap がプローブ ポイントを検出しているが、期待どおりに起動していないように見える場合は、コンパイラが関数の複数のバージョン (インラインとそうでないもの) を発行している可能性があります。stap -l 'process("foobar").function("_Z*").*'stap が検出した .call、.inline、および .return のバリエーションを確認してみてください。.return プローブはインラインでは機能しないため、.call インスタンスにのみ対応することに注意してください。

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

于 2011-12-20T22:18:19.177 に答える