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