Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
n args[] – массив аргументов, нумерующийся от 0 до <количество_аргументов – 1>.
Про последний массив надо сказать, что его
элементы определяются провайдером по своему усмотрению. Так, для провайдера
syscall на датчике entry в массиве arg[0..n] будут представлены аргументы
системного вызова, а на датчике return в массиве arg[0..1] коды возврата. А вот
для провайдера io в arg[0] будет указатель на структуру bufinfo. Значения
аргументов для всех провайдеров приведены в спецификации «Dynamic Tracing
Guide»(
Последнее, что следует сказать про переменные,– это их области видимости. Глобальные переменные декларируются с использованием синтаксиса языка С либо могут быть объявлены неявно при присваивании. В последнем случае такой переменной назначается тип выражения в правой части присваивания. Помимо глобальных переменных, которые видны всем компонентам (clauses) скрипта на D, можно создавать thread-local и clause-local переменные любого типа. Доступ к таким переменным осуществляется при помощи префиксов self-> и this-> соответственно. Префиксы служат как для того, чтобы разделить пространство имён для переменных, так и для того, чтобы без необходимости предварительной декларации использовать их в выражениях присваивания. Clause-local переменные содержатся в области памяти, которая используется повторно при исполнении данной компоненты и сродни автоматическим переменным в языке C. Thread-local переменные привязывают каждый индентификатор переменной к отдельным областям памяти для каждого потока команд в операционной системе.
Провайдеры
Вы уже знаете, что модификацию системы инструментальным кодом осуществляют провайдеры, и поскольку они формально отделены от ядра подсистемы трассировки, то это значит, что в DTrace возможно использовать неоднородные методологии внедрения кода инструментальных средств. Более того, количество методов со временем увеличивается, поскольку новые методы очень легко встроить в существующую реализацию DTrace. Но хотя провайдеры и используют разные методы внедрения инструментального кода, их объединяет тот факт, что все они не влияют на работу системы, если датчики находятся в выключенном состоянии.
Далее мы рассмотрим методологии, которые применяются в некоторых популярных провайдерах. Но сперва упомяну про три датчика, которые предоставляются провайдером DTrace – BEGIN, END и ERROR.
Датчик BEGIN всегда срабатывает только один раз в момент запуска скрипта, прежде чем сработает любой другой датчик. Причём до тех пор, пока не отработают все действия компоненты c идентификатором датчика BEGIN, никакой другой датчик сработать не может. Благодаря такому свойству BEGIN обеспечивает предварительную инициализацию переменных, которые могут понадобиться другим компонентам программы на D.
Датчик END тоже срабатывает только в единственный момент жизненного цикла программы, соответственно в самом конце и только тогда, когда отработали все другие датчики. Его удобно использовать для того чтобы обработать собранные в момент работы программы данные, отформатировать вывод и красиво показать итоговые результаты.
Датчик ERROR срабатывает в случае, когда при исполнении скрипта произошла ошибка времени исполнения, скажем, попытка разыменовывания указателя NULL.
Провайдер profile
Большая часть провайдеров привязывается к определённой точке в коде пользовательского приложения, программы или ядра. На этом фоне провайдер profile стоит особняком, поскольку вместо изменения кода использует источник асинхронных событий. Источником таких событий для profile являются прерывания по времени с заданным интервалом. И его датчики могут использоваться для того, чтобы производить снятие данных, которые отображают определённые аспекты состояния системы, или выполнять действия через строго определённые промежутки времени. В качестве простого, но часто встречающегося шаблона использования этого провайдера модифицируем пример с агрегациями следующим образом: