如何使用 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)

最佳答案

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

关于c++ - 使用 SystemTap 重载 C++ 方法分析,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7836343/

10-12 12:49