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