----------------------------------------------------------------------------- -- | -- Module : GHC.ExecutionStack -- Copyright : (c) The University of Glasgow 2013-2015 -- License : see libraries/base/LICENSE -- -- Maintainer : cvs-ghc@haskell.org -- Stability : internal -- Portability : non-portable (GHC Extensions) -- -- This is a module for efficient stack traces. This stack trace implementation -- is considered low overhead. Basic usage looks like this: -- -- @ -- import GHC.ExecutionStack -- -- myFunction :: IO () -- myFunction = do -- putStrLn =<< showStackTrace -- @ -- -- Your GHC must have been built with @libdw@ support for this to work. -- -- @ -- user@host:~$ ghc --info | grep libdw -- ,("RTS expects libdw","YES") -- @ -- -- @since 4.9.0.0 ----------------------------------------------------------------------------- module GHC.ExecutionStack ( Location (..) , SrcLoc (..) , getStackTrace , showStackTrace ) where import Control.Monad (join) import GHC.ExecutionStack.Internal -- | Get a trace of the current execution stack state. -- -- Returns @Nothing@ if stack trace support isn't available on host machine. getStackTrace :: IO (Maybe [Location]) getStackTrace :: IO (Maybe [Location]) getStackTrace = (forall (m :: * -> *) a. Monad m => m (m a) -> m a join forall b c a. (b -> c) -> (a -> b) -> a -> c . forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap StackTrace -> Maybe [Location] stackFrames) forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b `fmap` IO (Maybe StackTrace) collectStackTrace -- | Get a string representation of the current execution stack state. showStackTrace :: IO (Maybe String) showStackTrace :: IO (Maybe String) showStackTrace = forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b fmap (\[Location] st -> [Location] -> ShowS showStackFrames [Location] st String "") forall (f :: * -> *) a b. Functor f => (a -> b) -> f a -> f b `fmap` IO (Maybe [Location]) getStackTrace