如何使用 dtrace 打印 libstdc++ 字符串内容
Posted
技术标签:
【中文标题】如何使用 dtrace 打印 libstdc++ 字符串内容【英文标题】:How to print libstdc++ string content with dtrace 【发布时间】:2013-09-30 10:20:03 【问题描述】:我想编写一个 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。
【问题讨论】:
【参考方案1】:我自己找到了可行的解决方案。我的问题中的探针有一个愚蠢的错误 - 应该复制 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
类。如果使用对字符串的引用,它甚至可以工作。
【讨论】:
以上是关于如何使用 dtrace 打印 libstdc++ 字符串内容的主要内容,如果未能解决你的问题,请参考以下文章
如何用 D 语言正确打印 uint64_t (dtrace)
DTracing objc_msgSend 不打印接收器类名称