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

标签 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++ 中的字符串使用写入时复制,因此仅处理指针在这里是不够的。有人知道怎么做吗?我在 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/

相关文章:

c++ - std::errc ABI 可移植性

objective-c - 开发一个在用户使用 xcode 登录之前运行的 osx 守护进程

c++ - 体系结构 x86_64 : El Capitan 的 undefined symbol

C++ 类型在派生类构造期间发生变化 - 虚函数问题

c++ - C++ 中类似 Iterable 的行为是否可以实现?

macos - NSTextView:获取文本更改(插入和删除)

c++ - 如何使用 clang 将我的 c++ 程序与 osx 上的 libstdc++ 静态链接?

c++ - 哪种算法用于计算 GNU C++ 标准库的指数函数?

c++ - SSE 中的等零指令

c++ - 在多线程游戏中每帧都创建新的工作线程不好吗?