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

Posted

技术标签:

【中文标题】dtrace - 从调用函数的不同位置传递给函数的变量的聚合【英文标题】:dtrace - aggregation of variables passing to funcion from diffrent places where function was called 【发布时间】:2012-06-13 15:17:41 【问题描述】:

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

聚合可以在多个维度上被索引,即你可以这样写:

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

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

因此,上述聚合告诉您“FuncXXX 已从 ... 调用了多少次,并带有参数 arg1/arg2 的组合”。

【讨论】:

以上是关于dtrace - 从调用函数的不同位置传递给函数的变量的聚合的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 dtrace 跟踪函数?

是否可以使用 DTrace 查看传递给 strncpy 的参数?

DTrace - 如何在返回探针中正确检索初始参数

Python函数:使用批处理文件将参数从.txt文件传递给python函数并执行函数

如何将返回码传递给 at_exit 函数

横向解决方法:将参数从查询中的其他位置传递给集合返回函数