Ответ 1
Как автор dtrace4linux, позвольте мне ответить.
В сущности, dtrace для Linux/MacOS/FreeBSD/Solaris одинаково - мы все основываемся на том же исходном коде с теми же целями. Поскольку нет центрального помощника, коды эффективно вилки, а Solaris считается мастером. Основной отличием исходного кода является клей для каждой платформы.
DTrace - это комбинация нескольких вещей:
- драйвер ядра
- пользовательское пространство Команда "dtrace"
- механизмы функции зонда (например, syscall, fbt)
- язык сценариев
Посмотрите на syscall, проследив его довольно просто:
$ dtrace -n syscall::open:
.....
Это ловушки для каждого открытого системного вызова, независимо от того, кто его выполнил. Если вы знаете Unix, вы знаете, что syscall примерно:
open(char *filename, int flags, [int perms])
Итак, arg0 - это строка "filename". Но здесь все меняется. Функция C lib такая же, как и выше, но это отображает системный вызов, что-то вроде:
open(int someflags, char *filename, int userflags, int perms)
Итак, имя файла не указано в arg0, но arg1. (Извините, если это неверно - я думаю, что open()
в ядре и пользовательском пространстве одинаково, но это неверно, например, для семейства функций stat()
).
Здесь возникают некоторые проблемы "переносимости" DTrace - если вы используете руководство Solaris для dtrace и пытаетесь запустить некоторые из сценариев или примеров, вы можете обнаружить, что они не работают одинаково. Теоретически это ошибка Linux (мой), и dtrace4linux следует изменить, чтобы скрыть это.
Что касается всех системных вызовов.
Теперь посмотрим на fbt. Fbt - это просто функция отслеживания - любая функция - с любыми параметрами. Вы можете проследить функцию linux, которая реализует syscall open()
(ее называют sys_open
[возможно]). Если вы улавливаете эту функцию:
$ dtrace -n fbt::sys_open:
тогда вам нужно посмотреть исходный код ядра, чтобы узнать, что такое arg0, arg1, arg2 и т.д. И почти наверняка это отличается от Solaris или MacOS - подробности его реализации Linux.
Но вам может потребоваться доступ к некоторому аргументу, например. для получения некоторой внутренней структуры данных ядра (TCP, драйвер диска, драйвер USB и т.д.). Solaris предоставляет "провайдеры", которые представляют собой способы более высокого уровня доступа к структурам данных, чем знание "arg3 является" структурой foo * ". Без этих поставщиков скрипты были бы полностью зависимыми от opsys и без переносимости. Большинство людей не заботятся о структуре" tcp", но хотят получить доступ к ключевым полям, таким как pktin, pktout, rcvbytes, sndbytes.
В заключение dtrace4linux
и Solaris dtrace
предоставляет уровень переносимости, чтобы разрешить доступ к этим функциям или структурам, но ни dtrace4linux, ни Solaris не пытаются выполнить полную работу, чтобы обеспечить переносимость по тысячам структур в каждом ядре.
В общем, вы можете использовать скрипты для обучения в Solaris и использовать их, чтобы попытаться понять, что не работает, но попытка использовать их "как есть" будет расстраивать вас, если вы не знаете, что искать.
Я считаю dtrace4linux "неплохим" и "недостаточно хорошим", чтобы скрыть эти различия. (dtrace4linux примерно соответствует MacOS - если вы используете учебные пособия Solaris, некоторые могут не работать на Mac или FreeBSD).