在tcp探针中使用cs_cid导致Dtrace问题

时间:2013-11-12 11:58:04

标签: tcp dtrace

我正在尝试使用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。

我不确定我做错了什么,所以任何建议都会非常感谢...

1 个答案:

答案 0 :(得分:4)

简短的回答是,您发现的脚本利用了特定于操作系统的Solaris知识,因此与OS X无关。

查看Solaris's documentation for the tcp provider表明,对于tcp:::sendargs[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”的任何文件。也许那里已经有了你想要的东西。