Spec-Zone.ru › Haskell 8

Debug.Trace

Авторские права (c) Университет Глазго 2001
Лицензия BSD-стиль (см. файл libraries/base/LICENSE)
Разработчик libraries@haskell.org
Стабильность предварительная
Переносимость переносимый
Безопасный Haskell Небезопасный
Язык Haskell2010

Содержание

  • Отладка
  • Отладка с журналом событий
  • Маркеры фаз выполнения

Описание

Функции для отладки и мониторинга выполнения.

Они могут быть полезны для исследования ошибок или проблем с производительностью. Их не следует использовать в рабочем коде.

Отладка

Функции trace, traceShow и traceIO печатают сообщения в поток вывода. Они предназначены для «отладки с помощью printf», то есть для отслеживания потока выполнения и вывода интересных значений.

Все эти функции полностью вычисляют сообщение перед его выводом; поэтому, если сообщение не определено полностью, ни одна его часть не будет выведена.

Обычным потоком вывода является stderr. Для приложений Windows GUI (в которых нет stderr) вывод направляется в консоль отладки Windows. Некоторые реализации этих функций могут дополнять выводимую строку, чтобы указать, что вы используете отладку.

trace :: String -> a -> a Исходный код

Функция trace выводит сообщение отладки, заданное в качестве первого аргумента, прежде чем вернуть второй аргумент как результат.

Например, это возвращает значение f x, но сначала выводит сообщение.

>>> let x = 123; f = show
>>> trace ("calling f with x = " ++ show x) (f x)
"calling f with x = 123
123"

Функция trace следует использовать только для отладки или мониторинга выполнения. Функция не является референтно-прозрачной: её тип указывает, что это чистая функция, но она имеет побочный эффект вывода сообщения отладки.

traceId :: String -> String Исходный код

Как trace, но возвращает сообщение вместо третьего значения.

>>> traceId "hello"
"hello
hello"

С версии: base-4.7.0.0

traceShow :: Show a => a -> b -> b Исходный код

Как trace, но использует show для преобразования аргумента в String.

Это удобно для вывода значений интересных переменных или выражений внутри функции. Например, здесь мы выводим значения переменных x и y.

>>> let f x y = traceShow (x,y) (x + y) in f (1+2) 5
(3,5)
8

traceShowId :: Show a => a -> a Исходный код

Как traceShow, но возвращает показанное значение вместо третьего значения.

>>> traceShowId (1+2+3, "hello" ++ "world")
(6,"helloworld")
(6,"helloworld")

С версии: base-4.7.0.0

traceStack :: String -> a -> a Исходный код

как trace, но дополнительно выводит стек вызовов, если он доступен.

В текущей реализации GHC стек вызовов доступен только если программа была скомпилирована с -prof; в противном случае traceStack ведет себя точно как trace. Элементы стека вызовов соответствуют аннотациям SCC, поэтому рекомендуется использовать -fprof-auto или -fprof-auto-calls для автоматического добавления аннотаций SCC.

С версии: base-4.5.0.0

traceIO :: String -> IO () Исходный код

Функция traceIO выводит сообщение отладки из монады IO. Это упорядочивает вывод относительно других действий IO.

С версии: base-4.5.0.0

traceM :: Applicative f => String -> f () Исходный код

Как trace, но возвращает единицу в произвольном контексте Applicative. Позволяет удобно использовать в конструкции do-notation.

Обратите внимание, что применение traceM не является действием в контексте Applicative, так как traceIO имеет тип IO. В то время как новые привязки в следующем примере заставят выражения traceM вычисляться каждый раз, когда блок do выполняется, traceM "not crashed" будет вычислено только один раз, и сообщение будет выведено только один раз. Если ваша монада находится в MonadIO, liftIO . traceIO может быть лучшим вариантом.

>>> :{
do
    x <- Just 3
    traceM ("x: " ++ show x)
    y <- pure 12
    traceM ("y: " ++ show y)
    pure (x*2 + y)
:}
x: 3
y: 12
Just 18

С версии: base-4.7.0.0

traceShowM :: (Show a, Applicative f) => a -> f () Исходный код

Как traceM, но использует show для преобразования аргумента в String.

>>> :{
do
    x <- Just 3
    traceShowM x
    y <- pure 12
    traceShowM y
    pure (x*2 + y)
:}
3
12
Just 18

С версии: base-4.7.0.0

putTraceMsg :: String -> IO () Исходный код

Устарело: Используйте traceIO

Отладка с журналом событий

Отладка с журналом событий — это система профилирования производительности. Эти функции генерируют дополнительные события в журнал событий. В сочетании с инструментами профилирования журнала событий эти функции могут использоваться для мониторинга выполнения и исследования проблем с производительностью.

В настоящее время только GHC предоставляет профилирование журнала событий, подробности о его использовании см. в руководстве пользователя GHC. Эти функции существуют для других реализаций Haskell, но события не генерируются. Обратите внимание, что строковое сообщение всегда оценивается, независимо от того, доступно или включено ли профилирование.

traceEvent :: String -> a -> a Исходный код

Функция traceEvent ведет себя как trace, с той разницей, что сообщение отправляется в журнал событий, если профилирование журнала событий доступно и включено во время выполнения.

Подходит для использования в чистом коде. В контексте IO используйте traceEventIO вместо этого.

Обратите внимание, что при использовании SMP-среды выполнения GHC возможно (но редко), что будут дублироваться события, если два процессора одновременно вычисляют одну и ту же зацепку, использующую traceEvent.

С версии: base-4.5.0.0

traceEventIO :: String -> IO () Исходный код

Функция traceEventIO отправляет сообщение в журнал событий, если профилирование журнала событий доступно и включено во время выполнения.

По сравнению с traceEvent, traceEventIO упорядочивает событие относительно других действий IO.

С версии: base-4.5.0.0

Маркеры фаз выполнения

При анализе профиля выполнения программы часто нужно маркировать определенные точки или фазы выполнения и визуализировать их в профиле.

Например, программа может иметь несколько различных фаз с разным поведением в отношении производительности или ресурсов в каждой фазе. Для правильной интерпретации графика профиля необходимо увидеть начало и конец каждой фазы.

Маркеры позволяют это сделать: мы можем добавить аннотации в программу, чтобы генерировать маркер в подходящий момент во время выполнения, а затем увидеть это в профиле.

В настоящее время эта функция поддерживается в GHC только системой отслеживания журнала событий, но в будущем она может быть также поддерживаема профилированием кучи или другими инструментами профилирования. Эти функции существуют в других реализациях Haskell, но не имеют эффекта. Обратите внимание, что строковое сообщение всегда оценивается, независимо от того, доступно или включено ли профилирование.

traceMarker :: String -> a -> a Исходный код

Функция traceMarker отправляет маркер в журнал событий, если профилирование журнала событий доступно и включено во время выполнения. String — это имя маркера. Имя используется в инструментах профилирования, чтобы помочь различать маркеры.

Эта функция подходит для использования в чистом коде. В контексте IO используйте traceMarkerIO вместо неё.

Обратите внимание, что при использовании SMP-среды выполнения GHC возможно (но редко), что будут дублироваться события, если два процессора одновременно вычисляют одну и ту же зацепку, использующую traceMarker.

С версии: base-4.7.0.0

traceMarkerIO :: Строка -> IO () Исходный код

Функция traceMarkerIO записывает метку в журнал событий, если профилирование журнала событий доступно и включено во время выполнения.

По сравнению с traceMarker, traceMarkerIO упорядочивает событие относительно других действий IO.

С версии: base-4.7.0.0

© The University of Glasgow and others
Licensed under a BSD-style license (see top of the page).
https://downloads.haskell.org/~ghc/8.10.2/docs/html/libraries/base-4.14.1.0/Debug-Trace.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API