我正在尝试使用DTrace分析TCP滑动窗口。我找到了以下博文(https://blogs.oracle.com/amaguire/entry/dtrace_tcp_provider_and_tcp),其中包含一个dtrace脚本。不幸的是,我总是得到错误
line 4: translator does not define conversion for member: cs_cid
我还检查了tcp探针(https://wikis.oracle.com/display/DTrace/tcp+Provider)的文档,似乎已经定义了cs_cid。
我正在使用Mac OS X 10.9。
我不确定我做错了什么,所以任何建议都会非常感谢...
答案 0 :(得分:4)
简短的回答是,您发现的脚本利用了特定于操作系统的Solaris知识,因此与OS X无关。
查看Solaris's documentation for the tcp provider表明,对于tcp:::send
,args[1]
的类型为csinfo_t *
,其中
typedef struct csinfo {
uintptr_t cs_addr;
uint64_t cs_cid;
pid_t cs_pid;
zoneid_t cs_zoneid;
} csinfo_t;
这不是内核数据结构:它仅为了DTrace使用者的利益而存在,并由translator动态填充。这允许OS实现在不破坏依赖于接口的脚本的情况下进行更改。在Solaris系统上,您可以在csinfo_t
中找到/usr/lib/dtrace/ip.d
及其翻译器的定义。
不同的供应商可以自由地实施供应商。根据您的编写,似乎在OS X上,tcp:::send
的{{1}}不是args[1]
或csinfo_t *
不包含csinfo_t
}。如果没有任何证据证明OS X tcp提供者反映了Solaris,那么我会说使用你的脚本是徒劳的。
请注意,提供商不一定是最终用户。如果没有它的公开文档,那么我将查看是否有任何OS X实用程序使用它 - 查看包含例如字符串“cs_cid
”的任何文件。也许那里已经有了你想要的东西。