使用SystemTap重载c方法分析

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

解决方法:

从1.4开始,它应该可以用于探测受损的名称,至少在debuginfo描述它们时.我用你的例子构建了一个测试程序,“_ZN1A5doFooEv”和“_ZN1A5doFooEi”分别用于void和int case.这取决于编译器编写正确的MIPS_linkage_name.它有时也可以在符号表中工作,但这并不一定涵盖编译器可能生成的函数的所有优化版本.

要查看所有发现的受损名称,请尝试使用stap -l’process(“foobar”).function(“_ Z *”)’.通配符中必须使用_Z来触发处理损坏的名称.

如果stap正在寻找探测点,但它们似乎没有像你期望的那样激发,那么可能是编译器发出了你的函数的多个版本,无论是内联还是非内联.尝试使用stap -l’进程(“foobar”).function(“_ Z *”).*’查看找到的.call,.inline和.return的变体.请记住,.return探测器不适用于内联,因此它们只对应于.call实例.

请注意,@ file:line语法也可用于查找包含行的函数,因此您也可以使用它来锚定function.return表单,而不仅仅是.statement探测器.在这种情况下,您无需担心所有返回点 – 只需选择您关注的函数中的任何一行,它将捕获所有返回指令. (这假设您没有处理内联.)

上一篇:数据科学库--第六天


下一篇:linux – Systemtap对性能的影响