DTrace на Ubuntu, как?

Я бы хотел использовать DTrace в Ubuntu.

https://github.com/dtrace4linux/linux

Выше есть один файл для Linux, github.

  • Интересно, dtrace для Linux совпадает с dtrace для других ОС (Solaris, FreeBSD, OSX).
  • Я хотел бы найти руководство по использованию этого (dtraceforlinux).
  • Интересно, подходит ли мне приведенный ниже учебник по dtrace для solaris.

http://www.oracle.com/technetwork/server-storage/solaris/dtrace-tutorial-142317.html

Заранее спасибо. Путешественник


person Jeonghum    schedule 17.01.2013    source источник
comment
Связанное сообщение: stackoverflow.com/ questions / 2059311 /   -  person Shawn Chin    schedule 17.01.2013


Ответы (1)


Как автор dtrace4linux, позвольте мне ответить.

По сути, dtrace в Linux / MacOS / FreeBSD / Solaris одна и та же - все мы основаны на одном исходном коде с одинаковыми целями. Поскольку нет центрального сопровождающего, коды фактически являются ветвями, а Solaris считается ведущим. Основное отличие исходного кода - это связующее звено для каждой платформы.

DTrace - это комбинация нескольких вещей:

  • драйвер ядра
  • команда пользовательского пространства "dtrace"
  • механизмы функции зонда (например, syscall, fbt)
  • язык сценариев

Посмотрите, как трассировка системных вызовов довольно проста:

$ dtrace -n syscall::open:
.....

Это перехватывает каждый открытый системный вызов, независимо от того, кто его выполнил. Если вы знакомы с Unix, вы знаете, что системный вызов примерно такой:

open(char *filename, int flags, [int perms])

Итак, arg0 - это строка «имя файла». Но здесь все по-другому. Функция C lib такая же, как указано выше, но она отображается на системный вызов, который выглядит примерно так:

open(int someflags, char *filename, int userflags, int perms)

Таким образом, имя файла находится не в arg0, а в arg1. (Приносим извинения, если приведенное выше неверно - я думаю, что open() одинаково в ядре и в пространстве пользователя, но это неверно, например, для семейства функций stat()).

Именно здесь возникают некоторые из проблем «переносимости» DTrace - если вы воспользуетесь руководством Solaris по dtrace и попытаетесь запустить некоторые сценарии или примеры, вы можете обнаружить, что они не работают одинаково. Теоретически это вина Linux (моя), и dtrace4linux следует изменить, чтобы скрыть это.

Все это относится к системным вызовам.

Теперь посмотрим на fbt. Fbt - это просто трассировка функции - любой функции - с любыми параметрами. Вы можете отследить функцию linux, которая реализует системный вызов open() (он называется sys_open [возможно]). Если вы поймаете эту функцию:

$ dtrace -n fbt::sys_open:

тогда вам нужно посмотреть исходный код ядра, чтобы узнать, что такое arg0, arg1, arg2 и т. д. И почти наверняка отличается от Solaris или MacOS - детали реализации Linux.

Но вам может потребоваться доступ к некоторому аргументу, например чтобы получить некоторую внутреннюю структуру данных ядра (TCP, драйвер диска, драйвер USB и т. д.). Solaris предоставляет «провайдеров», которые представляют собой способы более высокого уровня доступа к структурам данных, чем знание «arg3 - это 'struct foo *'». Без этих поставщиков скрипты были бы полностью зависимы от opsys и не могли бы переноситься. Большинство людей не заботится о том, как выглядит структура "tcp", им нужен доступ к ключевым полям, таким как pktin, pktout, rcvbytes, sndbytes.

Таким образом, dtrace4linux и Solaris dtrace предоставляют уровень переносимости, позволяющий получить доступ к этим функциям или структурам, но ни dtrace4linux, ни Solaris не пытаются выполнить полную работу по обеспечению переносимости между тысячами структур в каждом ядре.

В общем, вы можете взять учебные сценарии Solaris и использовать их, чтобы попытаться понять, что не работает, но попытка использовать их «как есть» разочарует вас, если вы не знаете, что искать.

Я считаю dtrace4linux «неплохим» и «недостаточно хорошим», чтобы скрыть эти различия. (dtrace4linux примерно соответствует MacOS - если вы используете руководства по Solaris, некоторые из них могут не работать на Mac или FreeBSD).

person Paul    schedule 17.01.2013
comment
Я устанавливаю FreeBSD. ^^; - person Jeonghum; 18.01.2013
comment
ТАК нужна функция, в которой я могу присудить больше очков за ответы, которые выходят за рамки. Спасибо. - person allyourcode; 19.02.2015