我想写一个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。
答案 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
类。如果使用了对字符串的引用,它甚至可以工作。