0

抱歉标题过于复杂,但这是我的脚本的 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);

现在,我想聚合变量pand q,但是按照调用 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

有可能吗?或者我应该独立地追踪FirstFunc、、SecondFunc和?但问题是,在所有这些函数中,不能总是被调用。ThirdFuncFourthFuncFuncXXX

最好的问候和所有答案。

4

1 回答 1

0

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

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

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

因此,上述聚合告诉您“使用参数组合FuncXXX调用了多少次/ ”。...arg1arg2

于 2012-06-19T10:26:32.350 回答