1

我想编写一个 dtrace 探针,它可以匹配带有std::string参数的函数并打印字符串的内容:

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

我能够自己找到一个可行的解决方案。我的问题中的探针有一个愚蠢的错误 - 应该复制 arg0 而不是 arg1。所以工作探针是:

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 回答