gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 17:59:55 29 4
gpt4 key购买 nike

抱歉,标题很复杂,但这是我脚本的 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 并不总是可以被调用。

最诚挚的问候和感谢所有的答案。

最佳答案

聚合可以在多个维度上建立索引,即您可以编写:

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

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

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

关于c - dtrace - 从调用函数的不同位置传递到函数的变量的聚合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11018085/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com