对于编译的标题感到抱歉,但这是我的脚本的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
不能总是被调用。
最好的问候和所有答案的答案。
答案 0 :(得分:0)
聚合可以在多个维度中编制索引,即您可以编写:
@a[ustack(2), arg1, arg2] = count();
如果您只对探测函数的调用者感兴趣,也可以使用DTrace变量“caller
”(为您提供地址探测功能不幸地被调用 - 而不是符号名称)或者给ustack()
多个堆栈帧进行记录,ustack(2)
只给你一个probefunc(FuncXXX
在你的情况下)和它来自的地方。
上述汇总因此告诉您“FuncXXX
通过...
/ arg1
”组合调用了arg2
次的次数。