1

std::string関数と引数を照合し、文字列の内容を出力する dtrace プローブを作成したいと思います。

void func(std::string some) {
    /* some code here */
}

私はこのようにプローブを実装しようとしました:

pid$target::func(std??string):entry
{
    this->str = *(uintptr_t*)copyin(arg1, sizeof(char*));
    printf("arg1 %s", copyinstr(this->str));
}

残念ながら、これは私にはうまくいきません.dtraceは無効なアドレスを検出したと報告しています..また、ここには別の問題があります.libstdc ++の文字列は書き込み時にコピーを使用するため、ここではポインタを対処するだけでは十分ではありません. 誰もそれを行う方法を知っていますか? Mac OS X で dtrace を使用しています。

4

1 に答える 1

0

私は自分で実用的な解決策を見つけることができました。私の質問のプローブには愚かな間違いがあります.arg1の代わりにarg0をコピーする必要があります. したがって、動作するプローブは次のとおりです。

pid$target::func(*):entry 
{ 
    this->str = *((uintptr_t*)copyin(arg0, sizeof(void*)));
    printf("darg %s", copyinstr(this->str));
}

一方、メンバー関数には arg1 を使用する必要があります。

class some {
    public:
        void func(const std::string arg) {
            std::cout << "arg " << arg << std::endl;
        }
};

関数のプローブは次のsome::funcようになります。

pid$target::some??func(*):entry 
{ 
    this->str = *((uintptr_t*)copyin(arg1, sizeof(void*)));
    printf("darg %s", copyinstr(this->str));
}

これは、libc++ クラスと libstdc++std::stringクラスの両方で機能します。文字列への参照が使用されている場合でも機能します。

于 2013-09-30T16:27:45.573 に答える