Spec-Zone.ru › Haskell 9

Debug.Trace

Авторские права (c) The University of Glasgow 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, но возвращает значение типа unit в произвольном контексте Applicative. Удобна для использования в do-нотации.

Обратите внимание, что применение 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 () Источник

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

Начиная с: base-4.15.0.0

Маркеры этапов выполнения

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

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

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

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

traceMarker :: String -> a -> a Источник

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

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

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

Начиная с: base-4.7.0.0

traceMarkerIO :: String -> 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/9.14.1/docs/libraries/base-4.22.0.0-66f8/Debug-Trace.html

Spec-Zone.ru

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