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