使用SystemTap重载c ++方法分析

时间:2011-10-20 13:03:05

标签: c++ profiling overloading systemtap

如何区分使用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)不值得。

1 个答案:

答案 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探测器。在这种情况下,您无需担心所有返回点 - 只需选择您关注的函数中的任何一行,它将捕获所有返回指令。 (这假设你没有处理内联。)