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 语法也适用于查找包含一行的函数,因此您也可以使用它来锚定您的 function.return 表单,而不仅仅是 .statement 探针。在这种情况下,您无需担心所有返回点——只需选择您关心的函数中的任何一行,它就会捕获所有返回指令。(这是假设您不处理内联。)

于 2011-12-20T22:18:19.177 回答