dtrace - 从调用函数的不同位置传递给函数的变量的聚合

时间:2012-06-13 15:17:41

标签: c solaris dtrace

对于编译的标题感到抱歉,但这是我的脚本的dtrace输出,我认为这将有助于解释我在说什么:

        16384                1
        38048                1
        38050                1
        38051                1
        38055                1

    -58632623                1
     -5180681                1
     -4576706                1
     -4498881                1
     -4472021                1
     -4464140                1
<...>
mymodule.so`FuncXXX
mymodule.so`FirstFunc+0x23c
8

mymodule.so`FuncXXX
mymodule.so`SecondFunc+0x4bc
9

mymodule.so`FuncXXX
mymodule.so`ThirdFunc+0x1e1
35

mymodule.so`FuncXXX
mymodule.so`FourthFunc+0x70
39

dtrace脚本是:

pid$1:mymodule:FuncXXX:entry{
    @a[arg1] = count();
    @b[arg2] = count();
    @c[ustack()] = count();
}

FuncXXX有单身:void FuncXXX(void *arg, long int p, int q);

现在,我想聚合变量pq,但是为了调用FuncXXX,例如:

mymodule.so`FuncXXX'
mymodule.so`FirstFunc'+0x23c
8

            16384                1
            38048                1
            38050                1
            38051                1
            38055                1

        -58632623                1
         -5180681                1
         -4576706                1
         -4498881                1
         -4472021                1
         -4464140                1

mymodule.so`FuncXXX'
mymodule.so`SecondFunc'+0x4bc
9

            49599                1
            51533                1
            51535                1
            52149                1
            52152                1

          -148909                1
          -135530                1
          -121514                1
          -117860                1
               -97633                1
and so on

有可能吗?或者我应该独立追踪FirstFuncSecondFuncThirdFuncFourthFunc?但事实是,在所有这些功能中,FuncXXX不能总是被调用。

最好的问候和所有答案的答案。

1 个答案:

答案 0 :(得分:0)

聚合可以在多个维度中编制索引,即您可以编写:

@a[ustack(2), arg1, arg2] = count();

如果您只对探测函数的调用者感兴趣,也可以使用DTrace变量“caller”(为您提供地址探测功能不幸地被调用 - 而不是符号名称)或者给ustack()多个堆栈帧进行记录,ustack(2)只给你一个probefunc(FuncXXX在你的情况下)和它来自的地方。

上述汇总因此告诉您“FuncXXX通过... / arg1”组合调用了arg2次的次数。