C++ 过载c++;方法使用SystemTap进行分析

C++ 过载c++;方法使用SystemTap进行分析,c++,profiling,overloading,systemtap,C++,Profiling,Overloading,Systemtap,如何区分使用探测的重载方法 例如 在.stp文件中: probe process("foobar").function("A::doFoo<NO ARGS>").return { // do something } probe process("foobar").function("A::doFoo<USING INT>").return { // do something different } 探测进程(“foobar”).函数(“A::doFoo”

如何区分使用探测的重载方法

例如

在.stp文件中:

probe process("foobar").function("A::doFoo<NO ARGS>").return {
    // do something
}
probe process("foobar").function("A::doFoo<USING INT>").return {
    // do something different
}
探测进程(“foobar”).函数(“A::doFoo”).返回{
//做点什么
}
探测进程(“foobar”).函数(“A::doFoo”).返回{
//做些不同的事情
}

考虑到这两种方法可能都有足够多的返回点,因此不值得使用
.statement(@file:line)

自stap 1.4以来,它应该可以探测损坏的名称,至少如果debuginfo已经描述了它们。我用您的示例构建了一个测试程序,“_ZN1A5doFooEv”和“_ZN1A5doFooEi”分别用于void和int情况。不过,编写正确的MIPS\u链接\u名称取决于编译器。它有时也可以从符号表中工作,但这并不一定涵盖编译器可能生成的函数的所有优化版本

要查看所有发现的损坏名称,请尝试
stap-l'process(“foobar”).function(“\u Z*”)
。通配符中需要Z来触发对损坏名称的处理

如果stap正在查找探测点,但它们似乎不像您预期的那样启动,那么可能是编译器正在发出多个版本的函数,包括内联函数和非内联函数。尝试
stap-l'进程(“foobar”).function(“_Z*”).*”
查看stap找到的.call、.inline和.return的那些变体。请记住.return探测不在内联线上工作,所以它们只对应于.call实例


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

您尝试过损坏的函数名吗?尝试过
ldd
返回的损坏名称,但没有效果。事件,但它不会是可移植的,因为每个编译器都不受其损坏推理的影响。
probe process("foobar").function("A::doFoo<NO ARGS>").return {
    // do something
}
probe process("foobar").function("A::doFoo<USING INT>").return {
    // do something different
}