Когда в программе происходит что-то важное, вызываем «utp:report_event/5» (подставляем сюда название функции трассировки, которую объявили в шаге 1). По умолчанию данная функция не будет делать ничего, но впоследствии мы можем ее отловить, используя возможности трассировки Erlang. Вот пример взаимодействия, описанного выше:
Шаг 2. Трассируем события в программе
Contents: то, что будет отображено при щелчке на событие. Может предоставлять более детальную информацию о событии, не загромождая диаграмму.
Label: нотационная метка сообщения.
To: кому предназначено событие.
From: источник событий.
DetailLevel: число от 0 до 100. Оно обозначает уровень значимости данного события. Назначая основным событиям меньшие, а менее значимым бЈльшие числа, мы даём возможность трассировщику скрыть часть событий, таким образом добиваясь нужного уровеня гранулированности.
Описание аргументов:
Основная идея заключена во второй функции. Это функция-заглушка от пяти аргументов, которая сразу же отрабатывается. Возвращаемое значение «hopefully_traced» произвольно, но оно показывает что мы хотим вернуть из этой функции. Первая функция используется, когда мы отслеживаем исходящие и получаемые события одим и тем же компонентом.
report_event(_DetailLevel, _From, _To, _Label, _Contents) ->
?MODULE:report_event(DetailLevel, FromTo, FromTo, Label, Contents).
report_event(DetailLevel, FromTo, Label, Contents) ->
Первый шаг построить функцию трассировки. Моя выглядит следующим образом и расположена в модуле «utp».
Шаг 1. Строим функцию трассировки
Правда было бы здорово, если бы вы могли строить похожие диаграммы на основе данных трассировки программы автоматически? Что ж, Erlang вам в этом поможет. Я воспользуюсь некоторым кодом, что бы проиллюстрировать пример, как это сделать.
Предназначение данной диаграммы показать взаимодействие между различными параллельными компонентами системы. В данном примере Fred, Bob, Hank и Renee в ресторане. Каждый может легко нарисовать подобную диаграмму на бумаге. Проблема в том, что наброски на бумаге могут отличаться от того, что происходит во время выполнения вашей программы.
Вот одна из распространённых проблем многопоточных(concurrent) систем: события возникают постоянно в разных частях программы в разное время, и у вас нет возможности контролировать причину и время их возникновения. Чтобы отследить проблему, мы зачастую можем воспользоваться диаграммой последовательностей. Например, такой (спасибо Wikipedia):
Использование инструмента трассировки событий в Erlang
25 октября 2011 в 09:06
Использование инструмента трассировки событий в Erlang / Хабрахабр
Комментариев нет:
Отправить комментарий