Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/macos/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用dtrace打印libstdc++字符串内容_C++_Macos_Libstdc++_Dtrace - Fatal编程技术网

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

如何使用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。我自己找到了一个可行的解决方案。我问题中的

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

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));
}