GHC.Stack
| Авторские права | (c) Университет Глазго, 2011 |
|---|---|
| Лицензия | см. libraries/base/LICENSE |
| Сопровождающие | ghc-devs@haskell.org |
| Стабильность | внутренний |
| Переносимость | непереносимый (расширения GHC) |
| Безопасный Haskell | Safe |
| Язык | Haskell2010 |
Описание
Доступ к эмуляции стека вызовов GHC
Начиная с: base-4.5.0.0
errorWithStackTrace :: String -> a Исходный код
Устарело: error теперь добавляет стек вызовов
Подобно функции error, но добавляет трассировку стека к сообщению об ошибке, если она доступна.
Начиная с: base-4.7.0.0
Стек вызовов профилировщика
currentCallStack :: IO [String] Исходный код
Возвращает [String], представляющий текущий стек вызовов. Это может быть полезно для отладки.
Реализация использует эмуляцию стека вызовов, поддерживаемую профилировщиком, поэтому она работает, только если программа скомпилирована с помощью -prof и содержит подходящие аннотации SCC (например, добавленные с помощью -fprof-auto). В противном случае возвращённый список, скорее всего, будет пустым или малоинформативным.
Начиная с: base-4.5.0.0
whoCreated :: a -> IO [String] Исходный код
Получить трассировку стека, прикреплённую к объекту.
Начиная с: base-4.5.0.0
Стек вызовов HasCallStack
data CallStack Исходный код
CallStack — это лёгкий способ получить частичный стек вызовов в любой точке программы.
Функция может запросить место вызова с помощью ограничения HasCallStack. Например, можно определить
putStrLnWithCallStack :: HasCallStack => String -> IO ()
как вариант putStrLn, который получит место своего вызова и выведет его вместе со строкой, переданной в качестве аргумента. Доступ к стеку вызовов внутри putStrLnWithCallStack можно получить с помощью callStack.
>>> :{
putStrLnWithCallStack :: HasCallStack => String -> IO ()
putStrLnWithCallStack msg = do
putStrLn msg
putStrLn (prettyCallStack callStack)
:}
Таким образом, при вызове putStrLnWithCallStack мы получим отформатированный стек вызовов вместе со строкой.
>>> putStrLnWithCallStack "hello" hello CallStack (from HasCallStack): putStrLnWithCallStack, called at <interactive>:... in interactive:Ghci...
GHC разрешает ограничения HasCallStack в три этапа:
- Если в области видимости есть
CallStack— то есть у объемлющей функции есть ограничениеHasCallStack, — GHC добавит новое место вызова к существующемуCallStack. - Если в области видимости нет
CallStack— например, в приведённом выше сеансе GHCi, — и у объемлющего определения нет явной сигнатуры типа, GHC выведет ограничениеHasCallStackдля объемлющего определения (с учётом ограничения мономорфности). - Если в области видимости нет
CallStack, а у объемлющего определения есть явная сигнатура типа, GHC разрешит ограничениеHasCallStackдля одиночногоCallStack, содержащего только текущее место вызова.
CallStack не взаимодействуют с RTS и не требуют компиляции с помощью -prof. С другой стороны, поскольку они явно накапливаются посредством ограничений HasCallStack, обычно они содержат меньше информации, чем эмулируемые стеки вызовов, поддерживаемые RTS.
CallStack — это [(String, SrcLoc)]. String — имя вызванной функции, а SrcLoc — место вызова. Список упорядочен так, что последняя вызванная функция находится в начале.
ПРИМЕЧАНИЕ: Внимательный пользователь может заметить, что HasCallStack — всего лишь псевдоним неявного параметра ?callStack :: CallStack. Это деталь реализации, и её не следует считать частью API CallStack; в будущем мы можем изменить реализацию.
Начиная с: base-4.8.1.0
Экземпляры
| IsList CallStack Исходный код |
Обратите внимание: равенство 'fromList . toList = id' выполняется только для незамороженных Начиная с: base-4.9.0.0 |
||||
Определено в GHC.Internal.IsList Ассоциированные типы
| |||||
| Show CallStack Исходный код | Начиная с: base-4.9.0.0 |
||||
Определено в GHC.Internal.Show МетодыshowsPrec :: Int -> CallStack -> ShowS Исходный код show :: CallStack -> String Исходный код showList :: [CallStack] -> ShowS Исходный код | |||||
| type Item CallStack Исходный код | |||||
Определено в GHC.Internal.IsList | |||||
type HasCallStack = ?callStack :: CallStack Исходный код
Запросить CallStack.
ПРИМЕЧАНИЕ: Неявный параметр ?callStack :: CallStack является деталью реализации, и его не следует считать частью API CallStack; в будущем мы можем изменить реализацию.
Начиная с: base-4.9.0.0
callStack :: HasCallStack => CallStack Исходный код
Вернуть текущий CallStack.
*Не* включает место вызова callStack.
Начиная с: base-4.9.0.0
emptyCallStack :: CallStack Исходный код
Пустой CallStack.
Начиная с: base-4.9.0.0
freezeCallStack :: CallStack -> CallStack Исходный код
Заморозить стек вызовов, запретив добавлять новые места вызова.
pushCallStack callSite (freezeCallStack callStack) = freezeCallStack callStack
Начиная с: base-4.9.0.0
fromCallSiteList :: [([Char], SrcLoc)] -> CallStack Исходный код
Преобразовать список мест вызова в CallStack.
Начиная с: base-4.9.0.0
getCallStack :: CallStack -> [([Char], SrcLoc)] Исходный код
Извлечь список мест вызова из CallStack.
Список упорядочен по времени вызова, начиная с самого недавнего.
Начиная с: base-4.8.1.0
popCallStack :: CallStack -> CallStack Исходный код
Удалить последнее место вызова из CallStack.
Эта функция, как и pushCallStack, не действует на замороженный CallStack.
Начиная с: base-4.9.0.0
prettyCallStack :: CallStack -> String Исходный код
Красиво отформатировать CallStack.
Начиная с: ghc-internal-4.9.0.0
pushCallStack :: ([Char], SrcLoc) -> CallStack -> CallStack Исходный код
Добавить место вызова в стек.
Эта функция не действует на замороженный CallStack.
Начиная с: base-4.9.0.0
withFrozenCallStack :: HasCallStack => (HasCallStack => a) -> a Исходный код
Выполнить вычисление, не добавляя новые записи в CallStack.
Начиная с: base-4.9.0.0
Местоположения в исходном коде
data SrcLoc Исходный код
Отдельное местоположение в исходном коде.
Начиная с: base-4.8.1.0
Конструкторы
| SrcLoc | |
Поля
| |
Экземпляры
prettySrcLoc :: SrcLoc -> String Источник
Вывести в удобочитаемом формате SrcLoc.
С версии: ghc-internal-4.9.0.0
Внутренние компоненты
data CostCentreStack Источник
Стек центров затрат из профилировщика центров затрат GHC.
data CostCentre Источник
Центр затрат из профилировщика центров затрат GHC.
getCurrentCCS :: dummy -> IO (Ptr CostCentreStack) Источник
Возвращает текущий CostCentreStack (значение равно nullPtr, если текущая программа была скомпилирована без поддержки профилирования). Принимает фиктивный аргумент, который можно использовать, чтобы не допустить вынесения вызова getCurrentCCS упрощателем, что привело бы к неинформативному стеку (CAF).
getCCSOf :: a -> IO (Ptr CostCentreStack) Источник
Получить CostCentreStack, связанный с указанным значением.
clearCCS :: IO a -> IO a Источник
Выполнить вычисление с пустым стеком центров затрат. Например, интерпретатор использует это, чтобы выполнить интерпретируемое вычисление так, чтобы стек вызовов не показывал, что оно было запущено из GHC.
ccsCC :: Ptr CostCentreStack -> IO (Ptr CostCentre) Источник
Получить CostCentre в вершине CostCentreStack.
ccsParent :: Ptr CostCentreStack -> IO (Ptr CostCentreStack) Источник
Получить хвост CostCentreStack.
ccLabel :: Ptr CostCentre -> IO CString Источник
Получить метку CostCentre.
ccModule :: Ptr CostCentre -> IO CString Источник
Получить модуль CostCentre.
ccSrcSpan :: Ptr CostCentre -> IO CString Источник
Получить диапазон исходного кода CostCentre.
ccsToStrings :: Ptr CostCentreStack -> IO [String] Источник
Представить CostCentreStack в виде списка строк.
renderStack :: [String] -> String Источник
© 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/GHC-Stack.html