1+ {-# LANGUAGE GADTs #-}
2+
13module GHC.Debug.Client
24 ( Debuggee
35 , DebuggeeAction
@@ -7,6 +9,7 @@ module GHC.Debug.Client
79 , pauseDebuggee
810 , request
911 , Request (.. )
12+ , getCurrentFrame
1013 , getInfoTblPtr
1114 , decodeClosure
1215 , decodeStack
@@ -41,6 +44,7 @@ import System.Endian
4144import Data.Foldable
4245import Data.Coerce
4346import Data.Bitraversable
47+ import Data.Word (Word32 )
4448
4549
4650import qualified Data.Dwarf as Dwarf
@@ -61,6 +65,7 @@ data Debuggee = Debuggee { debuggeeHdl :: Handle
6165 , debuggeeInfoTblEnv :: HM. HashMap InfoTablePtr RawInfoTable
6266 , debuggeeDwarf :: Maybe Dwarf
6367 , debuggeeFilename :: FilePath
68+ , debuggeeFrame :: Word32
6469 }
6570
6671type DebuggeeAction a = StateT Debuggee IO a
@@ -101,13 +106,19 @@ withDebuggeeSocket exeName sockName mdwarf action = do
101106 s <- socket AF_UNIX Stream defaultProtocol
102107 connect s (SockAddrUnix sockName)
103108 hdl <- socketToHandle s ReadWriteMode
104- evalStateT action (Debuggee hdl mempty mdwarf exeName)
109+ evalStateT action (Debuggee hdl mempty mdwarf exeName 0 )
105110
106111-- | Send a request to a 'Debuggee' paused with 'pauseDebuggee'.
107112request :: Request resp -> DebuggeeAction resp
108113request req = do
109- hdl <- gets debuggeeHdl
110- liftIO $ doRequest hdl req
114+ hdl <- gets debuggeeHdl
115+ payload <- liftIO $ doRequest hdl req
116+ -- if we did a successful pause, the payload contains the current frame
117+ -- number
118+ case req of
119+ RequestPause -> modify' $ \ d -> d { debuggeeFrame = payload }
120+ _ -> return ()
121+ return payload
111122
112123lookupInfoTable :: RawClosure -> DebuggeeAction (RawInfoTable , RawClosure )
113124lookupInfoTable rc = do
@@ -248,3 +259,7 @@ warnIfNewer fpSrc fpBin = do
248259 fpSrc fpBin
249260 else
250261 return ()
262+
263+ -- | Return the current frame number
264+ getCurrentFrame :: DebuggeeAction Word32
265+ getCurrentFrame = gets debuggeeFrame
0 commit comments