如何使用dtrace打印libstdc ++字符串内容

时间:2013-09-30 10:20:03

标签: c++ macos libstdc++ dtrace

我想写一个dtrace探针,它将函数与std::string参数匹配并打印字符串的内容:

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

我尝试实施探针like this

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

不幸的是,这对我不起作用,dtrace报告它检测到无效地址。此外,这里还有另一个问题 - libstdc ++中的字符串使用copy on write,因此仅仅处理指针是不够的。有谁知道怎么做?我在mac os x上使用dtrace。

1 个答案:

答案 0 :(得分: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类。如果使用了对字符串的引用,它甚至可以工作。