Spec-Zone.ru › Haskell 9

GHC.Stack

Авторские права (c) Университет Глазго 2011
Лицензия см. libraries/base/LICENSE
Поддержка ghc-devs@haskell.org
Стабильность внутренняя
Переносимость непереносимая (расширения GHC)
Безопасный Haskell Безопасный
Язык Haskell2010

Содержание

  • Профилирование стеков вызовов
  • Стеки вызовов HasCallStack
  • Расположения исходного кода
  • Внутренние детали

Описание

Доступ к моделированию стека вызовов GHC

С момента выпуска: base-4.5.0.0

errorWithStackTrace :: Строка -> a Исходный код

Устаревшее: error добавляет стек вызовов сейчас

Подобно функции error, но добавляет в сообщение об ошибке трассировку стека, если она доступна.

С момента выпуска: base-4.7.0.0

Профилирование стеков вызовов

currentCallStack :: IO [Строка] Исходный код

Возвращает [String] представление текущего стека вызовов. Это может быть полезно для отладки.

Реализация использует моделирование стека вызовов, поддерживаемое профайлером, поэтому она работает только в том случае, если программа была скомпилирована с -prof и содержит соответствующие аннотации SCC (например, с использованием -fprof-auto). В противном случае список, возвращаемый, вероятно, будет пустым или неинформативным.

С момента выпуска: base-4.5.0.0

whoCreated :: a -> IO [Строка] Исходный код

Получить трассировку стека, прикрепленную к объекту.

С момента выпуска: 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 в три шага:

  1. Если в области видимости находится CallStack (то есть у окружающей функции есть ограничение HasCallStack), GHC добавит новую точку вызова к существующему CallStack.
  2. Если в области видимости нет CallStack (например, в сессии GHCi выше), и у окружающего определения нет явного типа подписи, GHC выведет ограничение HasCallStack для окружающего определения (с учетом ограничения мономорфизма).
  3. Если в области видимости нет 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' только для не-замороженных CallStack , так как toList удаляет информацию о заморозке.

С момента выпуска: base-4.9.0.0

Подробности реализации

Определено в GHC.Internal.IsList

Связанные типы

type Элемент CallStack
Подробности реализации

Определено в GHC.Internal.IsList

type Элемент CallStack = (Строка, SrcLoc)

Методы

fromList :: [Элемент CallStack] -> CallStack Исходный код

fromListN :: Целое -> [Элемент CallStack] -> CallStack Исходный код

toList :: CallStack -> [Элемент CallStack] Исходный код

Show CallStack Исходный код

С момента выпуска: base-4.9.0.0

Подробности реализации

Определено в GHC.Internal.Show

Методы

showsPrec :: Целое -> CallStack -> ShowS Исходный код

show :: CallStack -> Строка Исходный код

showList :: [CallStack] -> ShowS Исходный код

type Элемент CallStack Исходный код
Подробности реализации

Определено в GHC.Internal.IsList

type Элемент CallStack = (Строка, SrcLoc)

type HasCallStack = ?callStack :: CallStack Source

Запросите CallStack.

ПРИМЕЧАНИЕ: Неявный параметр ?callStack :: CallStack — это деталь реализации, и его не следует считать частью API CallStack, мы можем изменить реализацию в будущем.

С тех пор как: base-4.9.0.0

callStack :: HasCallStack => CallStack Source

Возвращает текущий CallStack.

Не включает место вызова callStack.

С тех пор как: base-4.9.0.0

emptyCallStack :: CallStack Source

Пустой CallStack.

С тех пор как: base-4.9.0.0

freezeCallStack :: CallStack -> CallStack Source

Заморозить стек вызовов, предотвратив добавление новых мест вызовов.

pushCallStack callSite (freezeCallStack callStack) = freezeCallStack callStack

С тех пор как: base-4.9.0.0

fromCallSiteList :: [([Char], SrcLoc)] -> CallStack Source

Преобразовать список мест вызовов в CallStack.

С тех пор как: base-4.9.0.0

getCallStack :: CallStack -> [([Char], SrcLoc)] Source

Извлечь список мест вызовов из CallStack.

Список упорядочен по последнему вызову.

С тех пор как: base-4.8.1.0

popCallStack :: CallStack -> CallStack Source

Удалить самое последнее место вызова из стека CallStack.

Эта функция, как и pushCallStack, не оказывает влияния на замороженный CallStack.

С тех пор как: base-4.9.0.0

prettyCallStack :: CallStack -> String Source

Красиво вывести CallStack.

С тех пор как: ghc-internal-4.9.0.0

pushCallStack :: ([Char], SrcLoc) -> CallStack -> CallStack Source

Добавить место вызова в стек.

Эта функция не оказывает влияния на замороженный CallStack.

С тех пор как: base-4.9.0.0

withFrozenCallStack :: HasCallStack => (HasCallStack => a) -> a Source

Выполнить вычисление без добавления новых записей в CallStack.

С тех пор как: base-4.9.0.0

Местоположения исходного кода

data SrcLoc Source

Единственное местоположение в исходном коде.

С тех пор как: base-4.8.1.0

Конструкторы

SrcLoc

Поля

  • srcLocPackage :: [Char]
  • srcLocModule :: [Char]
  • srcLocFile :: [Char]
  • srcLocStartLine :: Int
  • srcLocStartCol :: Int
  • srcLocEndLine :: Int
  • srcLocEndCol :: Int
Примеры
Подробности примеров
Generic SrcLoc Исходный код
Подробности примера

Определено в GHC.Internal.Generics

Связанные типы

type Rep SrcLoc

С момента: base-4.15.0.0

Подробности примера

Определено в GHC.Internal.Generics

type Rep SrcLoc = D1 ('MetaData "SrcLoc" "GHC.Internal.Stack.Types" "ghc-internal" 'False) (C1 ('MetaCons "SrcLoc" 'PrefixI 'True) ((S1 ('MetaSel ('Just "srcLocPackage") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Символ]) :*: (S1 ('MetaSel ('Just "srcLocModule") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Символ]) :*: S1 ('MetaSel ('Just "srcLocFile") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Символ]))) :*: ((S1 ('MetaSel ('Just "srcLocStartLine") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Целое) :*: S1 ('MetaSel ('Just "srcLocStartCol") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Целое)) :*: (S1 ('MetaSel ('Just "srcLocEndLine") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Целое) :*: S1 ('MetaSel ('Just "srcLocEndCol") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Целое)))))

Методы

from :: SrcLoc -> Rep SrcLoc x Исходный код

to :: Rep SrcLoc x -> SrcLoc Исходный код

Show SrcLoc Исходный код

С момента: base-4.9.0.0

Подробности примера

Определено в GHC.Internal.Show

Методы

showsPrec :: Целое -> SrcLoc -> ShowS Исходный код

show :: SrcLoc -> Строка Исходный код

showList :: [SrcLoc] -> ShowS Исходный код

Eq SrcLoc Исходный код

С момента: base-4.9.0.0

Подробности примера

Определено в GHC.Internal.Stack.Types

Методы

(==) :: SrcLoc -> SrcLoc -> Булево Исходный код

(/=) :: SrcLoc -> SrcLoc -> Булево Исходный код

type Rep SrcLoc Исходный код

С момента: base-4.15.0.0

Подробности экземпляра

Определено в GHC.Internal.Generics

type Rep SrcLoc = D1 ('MetaData "SrcLoc" "GHC.Internal.Stack.Types" "ghc-internal" 'False) (C1 ('MetaCons "SrcLoc" 'PrefixI 'True) ((S1 ('MetaSel ('Just "srcLocPackage") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Char]) :*: (S1 ('MetaSel ('Just "srcLocModule") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Char]) :*: S1 ('MetaSel ('Just "srcLocFile") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 [Char]))) :*: ((S1 ('MetaSel ('Just "srcLocStartLine") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int) :*: S1 ('MetaSel ('Just "srcLocStartCol") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int)) :*: (S1 ('MetaSel ('Just "srcLocEndLine") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int) :*: S1 ('MetaSel ('Just "srcLocEndCol") 'NoSourceUnpackedness 'NoSourceStrictness 'DecidedLazy) (Rec0 Int)))))

prettySrcLoc :: SrcLoc -> String Источник

Красивый вывод SrcLoc.

С: ghc-internal-4.9.0.0

Внутреннее

data CostCentreStack Источник

Стек центров затрат из профайлера центров затрат GHC.

data CostCentre Источник

Центр затрат из профайлера центров затрат GHC.

getCurrentCCS :: dummy -> IO (Указатель CostCentreStack) Источник

Возвращает текущий CostCentreStack (значение nullPtr, если текущая программа не была скомпилирована с поддержкой профилирования). Принимает аргумент dummy, который можно использовать для предотвращения вызова getCurrentCCS из-за упрощения, что привело бы к неинформативному стеку (CAF).

getCCSOf :: a -> IO (Указатель CostCentreStack) Источник

Получить CostCentreStack, связанный с заданным значением.

clearCCS :: IO a -> IO a Источник

Выполнить вычисление со стеком центров затрат пустого значения. Например, это используется интерпретатором для выполнения интерпретируемого вычисления без показа стека вызовов, что он был вызван из GHC.

ccsCC :: Указатель CostCentreStack -> IO (Указатель CostCentre) Источник

Получить CostCentre в начале CostCentreStack.

ccsParent :: Указатель CostCentreStack -> IO (Указатель CostCentreStack) Источник

Получить хвост CostCentreStack.

ccLabel :: Указатель CostCentre -> IO CString Источник

Получить метку CostCentre.

ccModule :: Указатель CostCentre -> IO CString Источник

Получить модуль CostCentre.

ccSrcSpan :: Указатель CostCentre -> IO CString Источник

Получить область исходного кода CostCentre.

ccsToStrings :: Указатель CostCentreStack -> IO [String] Источник

Форматировать CostCentreStack как список строк.

renderStack :: [String] -> String Source

© 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/GHC-Stack.html

Spec-Zone.ru

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