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);
现在,我想聚合变量 p
和 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
、ThirdFunc
和FourthFunc
?但问题是,在所有这些函数中,FuncXXX
并不总是被调用。
最好的问候和所有的答案。
【问题讨论】:
【参考方案1】:聚合可以在多个维度上被索引,即你可以这样写:
@a[ustack(2), arg1, arg2] = count();
如果您只对探测函数的调用者感兴趣,您也可以使用 DTrace 变量“caller
”(为您提供地址不幸的是,probe func 被调用了 - 不是符号名称)或给ustack()
一些堆栈帧来记录,ustack(2)
只是给你probefunc(在你的情况下为FuncXXX
)和它被调用的地方。
因此,上述聚合告诉您“FuncXXX
已从 ...
调用了多少次,并带有参数 arg1
/arg2
的组合”。
【讨论】:
以上是关于dtrace - 从调用函数的不同位置传递给函数的变量的聚合的主要内容,如果未能解决你的问题,请参考以下文章
是否可以使用 DTrace 查看传递给 strncpy 的参数?