如何区分使用SystemTap探针的重载方法?
E.g。
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)
不值得。
答案 0 :(得分:5)
自1.4版以来,它应该可以用于探测受损的名称,至少在debuginfo描述它们时。我用你的例子构建了一个测试程序,“_ZN1A5doFooEv”和“_ZN1A5doFooEi”分别用于void和int case。这取决于编译器编写正确的MIPS_linkage_name。它有时也可以在符号表中工作,但这并不一定涵盖编译器可能生成的函数的所有优化版本。
要查看所有已发现的受损名称,请尝试stap -l 'process("foobar").function("_Z*")'
。通配符中必须使用_Z来触发处理损坏的名称。
如果stap正在寻找探测点,但它们似乎没有像你期望的那样激发,那么可能是编译器发出了你的函数的多个版本,无论是内联还是非内联。尝试使用stap -l 'process("foobar").function("_Z*").*'
查看主要发现的.call,.inline和.return的变体。请记住,.return探测器不适用于内联,因此它们只对应于.call实例。
请注意,@ file:line语法也可用于查找包含行的函数,因此您也可以使用它来锚定function.return表单,而不仅仅是.statement探测器。在这种情况下,您无需担心所有返回点 - 只需选择您关注的函数中的任何一行,它将捕获所有返回指令。 (这假设你没有处理内联。)