Spec-Zone.ru › Haskell 9

Debug.Trace

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

Содержание

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

Описание

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

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

Отладка

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

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

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

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

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

Например, это возвращает значение f x и выводит сообщение в stderr. В зависимости от вашего терминала (настроек), они могут быть смешаны или нет.

>>> 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", x, "y", y) (x + y) in f (1+2) 5
("x",3,"y",5)
8

Обратите внимание, что в этом примере мы также создаем простые метки, просто включив некоторые строки.

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

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

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

С момента: base-4.7.0.0

traceWith :: (a -> String) -> a -> a Исходный код

Как trace, но выводит результат вызова функции над аргументом.

>>> traceWith fst ("hello","world")
hello
("hello","world")

С момента: base-4.18.0.0

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

Как traceWith, но использует show для преобразования результата функции в String.

>>> traceShowWith length [1,2,3]
3
[1,2,3]

С момента: base-4.18.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 возможно (но редко), что события дублируются, если два процессора одновременно оценивают один и тот же thunk, который использует traceEvent.

С момента: base-4.5.0.0

traceEventWith :: (a -> String) -> a -> a Исходный код

Подобно traceEvent, но выводит результат вызова функции над аргументом.

С момента: base-4.18.0.0

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

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

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

С момента: base-4.5.0.0

flushEventLog :: IO () Source

Немедленно очистить журнал событий, если он включён.

Since: base-4.15.0.0

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

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

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

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

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

traceMarker :: String -> a -> a Source

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

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

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

Since: base-4.7.0.0

traceMarkerIO :: String -> IO () Source

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

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

Since: 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/9.12.1/docs/libraries/base-4.21.0.0-8e62/Debug-Trace.html

Spec-Zone.ru

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