我想编写一个 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++ 中的字符串使用写入时复制,因此仅处理指针在这里是不够的。有人知道怎么做吗?我在 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;
}
};
函数 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
类。如果使用对字符串的引用,它甚至可以工作。
关于c++ - 如何使用 dtrace 打印 libstdc++ 字符串内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19091718/