ghc-debug-client-0.1.0.0: src/GHC/Debug/Snapshot.hs
-- | Functions for creating and running snapshots.
module GHC.Debug.Snapshot ( -- * Generating snapshots
snapshot
, makeSnapshot
-- * Using a snapshot
, snapshotRun
-- * Low level
, traceFrom ) where
import GHC.Debug.Trace
import GHC.Debug.ParTrace
import GHC.Debug.Client.Monad
import GHC.Debug.Client
import Control.Monad.Identity
import Control.Monad.Trans
-- | Make a snapshot of the current heap and save it to the given file.
snapshot :: FilePath -> DebugM ()
snapshot fp = do
precacheBlocks
rs <- gcRoots
_so <- savedObjects
tracePar rs
saveCache fp
-- | Traverse the tree from GC roots, to populate the caches
-- with everything necessary.
traceFrom :: [ClosurePtr] -> DebugM ()
traceFrom cps = runIdentityT (traceFromM funcs cps)
where
nop = const (return ())
funcs = TraceFunctions nop nop clos (const (return ())) nop
clos :: ClosurePtr -> SizedClosure -> (IdentityT DebugM) ()
-> (IdentityT DebugM) ()
clos _cp sc k = do
let itb = info (noSize sc)
_traced <- lift $ getSourceInfo (tableId itb)
k
-- | Pause the process and create a snapshot of
-- the heap. The snapshot can then be loaded with
-- 'snapshotRun' in order to perform offline analysis.
makeSnapshot :: Debuggee -> FilePath -> IO ()
makeSnapshot e fp = runAnalysis (snapshot fp) (const (return ())) e