Краткий ответ заключается в том, что сценарий, который вы нашли, использует знание ОС Solaris и поэтому не имеет отношения к OS X.
Глядя на документацию Solaris для провайдера TCP, видно, что для 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 и динамически заполняется переводчик. Это позволяет изменять реализацию ОС, не нарушая сценарии, которые стали полагаться на интерфейс. В системе Solaris вы найдете определение csinfo_t
и его транслятор в /usr/lib/dtrace/ip.d
.
Различные поставщики могут свободно реализовывать поставщиков по своему усмотрению. Из того, что вы написали, кажется, что в OS X либо tcp:::send
args[1]
не является csinfo_t *
, либо csinfo_t
не содержит cs_cid
. Без каких-либо доказательств того, что провайдер tcp для OS X отражает провайдера Solaris, я бы сказал, что бесполезно продолжать использование вашего сценария.
Обратите внимание, что поставщик не обязательно должен быть предназначен для конечных пользователей. Если для него нет общедоступной документации, я бы посмотрел, есть ли какие-либо утилиты OS X, использующие его, - поищите любые файлы, содержащие, например, строку «tcp:::
». Возможно, там уже есть что-то, что делает то, что вы хотите.
person
Robert Harris
schedule
14.11.2013