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);

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または、 、SecondFuncThirdFuncおよび をFourthFunc個別にトレースする必要がありますか? しかし、問題は、その関数のすべてで、FuncXXX常に呼び出すことができるとは限らないということです。

すべての回答によろしくお願いします。

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 に答える