Dtrace проблемы с cs_cid в tcp probe

Я пытаюсь проанализировать скользящее окно TCP с помощью DTrace. Я нашел следующую запись в блоге (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.

Я не уверен, что я делаю неправильно, поэтому любой совет будет принят с благодарностью...


person markovuksanovic    schedule 12.11.2013    source источник
comment
Какую ОС вы используете?   -  person Robert Harris    schedule 12.11.2013


Ответы (1)


Краткий ответ заключается в том, что сценарий, который вы нашли, использует знание ОС 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
comment
кажется, что cs_cid даже недоступен на mac os x. Я использовал комбинацию src ip, src port, dest ip, dest port вместо cs_cid. Я не уверен, что это подходящая замена, но это сработало для меня. - person markovuksanovic; 18.11.2013