如何使用dtrace打印libstdc++字符串内容
我想编写一个dtrace探测,它将匹配一个函数和std::string参数,并打印字符串的内容:如何使用dtrace打印libstdc++字符串内容,c++,macos,libstdc++,dtrace,C++,Macos,Libstdc++,Dtrace,我想编写一个dtrace探测,它将匹配一个函数和std::string参数,并打印字符串的内容: void func(std::string some) { /* some code here */ } 我尝试实施该探测: 不幸的是,这对我不起作用,dtrace报告它检测到无效地址。。另外,这里还有另一个问题——libstdc++中的字符串使用写时复制,所以在这里仅仅处理指针是不够的。有人知道怎么做吗?我正在mac os x上使用dtrace。我自己找到了一个可行的解决方案。我问题中的
void func(std::string some) {
/* some code here */
}
我尝试实施该探测:
不幸的是,这对我不起作用,dtrace报告它检测到无效地址。。另外,这里还有另一个问题——libstdc++中的字符串使用写时复制,所以在这里仅仅处理指针是不够的。有人知道怎么做吗?我正在mac os x上使用dtrace。我自己找到了一个可行的解决方案。我问题中的探测器有一个愚蠢的错误-应该复制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;
}
};
这适用于libc++和libstdc++std::string类。即使使用了对字符串的引用,它也可以工作
class some {
public:
void func(const std::string arg) {
std::cout << "arg " << arg << std::endl;
}
};
pid$target::some??func(*):entry
{
this->str = *((uintptr_t*)copyin(arg1, sizeof(void*)));
printf("darg %s", copyinstr(this->str));
}