Problems understanding Spineless Tagless G-Machine

Esa Ilari Vuokko eivuokko at gmail.com
Tue May 16 20:46:37 EDT 2006


Hi

I was playing with bindings to Windows Debug API and made a
small tracer for executables built with ghc.  That fun turned
into adventure into deciphering STG-structures.  Unfortunately
I just don't seem to be able decipher everything myself, and
so I have few questions.

In case someone's interested, code is available [1].  It's very
much work in progress and a toy, but I think the reading STG/RTS
structures is pretty abstracted from specifics of mingw32 port
of GHC. It's incomplete, but it does show sensible traces for
single-threaded (haskell thread) apps.  It probably only works
against ghc 6.4.2.

This is what I did up to now:
 * Use nm to get symbols, I deduct which are haskell symbols
   (pretty succesfully) and zdecode them.  I know by name which
   symbols are (_static)_info, _srt and _closure.
 * I set breakpoints on _info-symbols as specified by regexp on
   commandline.
 * When debugged program is stopped on breakpoint I show a trace
   of Sp-stack by traversing from Sp.  I deduct symbols, and
   if frames point "inside" symbol's region.  Small values I
   interpret as special ints.  After printing trace, the debugged
   program is allowed to continue.
 * I am stuck at decoding StgInfoTable and the "subtypes".

I am stuck despite reading (but apparently I didn't understand)
how GC walks the stack and other bits in ghc source, and reading
relevant sounding docs pointed by wiki [2].

 * Is it even possible to walk the stack in this manner?
   Kind of critical question :-)  (I realise I can't deduct
   all functions correctly at the moment)
 * How do I know if pointer to InfoTable in stack is FunInfoTable?
   Or RetInfoTable?  Thunks I suppose are identified by closure
   type's flags.  (I identify _THU-flagged as ThunkInfoTable and
   FUN_-closures as FunInfoTable currently.)  run-time-system.ps
   mentions, very useful sounding function/macro called isFUN,
   and friends, but I couldn't find them in ghc sources.
 * I can't see correlation between Sp-stack entries and
   arities/function types (as told by StgFunInfoTable.f.fun_type)
   and other entries in the stack.  Should I?

Please help, I could use pointers (even if they are: read docs again)
or direct answers (if there's easy ones.)

[1] darcs get http://tamelambda.net/darcs/tracer/
[2] http://cvs.haskell.org/trac/ghc/wiki/GhcPapers

Best regards,
Esa


Here's a sample session (unfortunately, it currently prints lots
of long lines)

D:\source\haskell\tracer>tracer putStrLn loopy.exe
Breakpoints matched by "putStrLn" :
System.IO_putStrLn
Tracing: System.IO_putStrLn
  SeInfo (Info False,"System.IO_putStrLn",4201884) 0 (Just (ItFun
4201884 (InfoTableHeader 7 CtFUN_STATIC [Ctf_HNF,Ctf_NS,Ctf_STA,Ctf_SRT]
0) 2 (SfaArg [True])))
  SeUnresolvedHeap 12324964
  SeInfo (Info False,"GHC.IOBase_bindIO",4205932) 46 (Just (ItFun
4205932 (InfoTableHeader 0 CtFUN_STATIC [Ctf_HNF,Ctf_NS,Ctf_STA,Ctf_SRT]
0) 3 (SfaArg [True,True])))
  SeUnresolvedHeap 12324956
  SeInfo (Info False,"GHC.TopHandler_runMainIO",4202476) 126 (Just
(ItFun 4202476 (InfoTableHeader 7 CtFUN_STATIC [Ctf_H
NF,Ctf_NS,Ctf_STA,Ctf_SRT] 0) 2 (SfaArg [True])))
  SeInfo (Info False,"stg_catch_frame",4284236) 0 (Just (ItUnresolved
4284236 (InfoTableHeader 0 CtCATCH_FRAME [Ctf_BTM]
 34)))
  SeOther 0
  SeInfo (Closure,"GHC.TopHandler_topHandler",4387480) 0 Nothing
  SeInfo (Info False,"stg_noforceIO",4314344) 0 (Just (ItUnresolved
4314344 (InfoTableHeader 0 CtRET_SMALL [Ctf_BTM,Ctf_
SRT] 0)))
  SeInfo (Info False,"stg_stop_thread",4314204) 0 (Just (ItUnresolved
4314204 (InfoTableHeader 0 CtSTOP_FRAME [Ctf_BTM]
0)))
Tracing: System.IO_putStrLn
  SeInfo (Info False,"System.IO_putStrLn",4201884) 0 (Just (ItFun
4201884 (InfoTableHeader 7 CtFUN_STATIC [Ctf_HNF,Ctf_NS,Ctf_STA,Ctf_SRT]
0) 2 (SfaArg [True])))
  SeUnresolvedHeap 12326836
  SeInfo (Info False,"GHC.TopHandler_runMainIO",4202476) 126 (Just
(ItFun 4202476 (InfoTableHeader 7 CtFUN_STATIC
[Ctf_HNF,Ctf_NS,Ctf_STA,Ctf_SRT] 0) 2 (SfaArg [True])))
  SeInfo (Info False,"stg_catch_frame",4284236) 0 (Just (ItUnresolved
4284236 (InfoTableHeader 0 CtCATCH_FRAME [Ctf_BTM] 34)))
  SeOther 0
  SeInfo (Closure,"GHC.TopHandler_topHandler",4387480) 0 Nothing
  SeInfo (Info False,"stg_noforceIO",4314344) 0 (Just (ItUnresolved
4314344 (InfoTableHeader 0 CtRET_SMALL [Ctf_BTM,Ctf_ SRT] 0)))
  SeInfo (Info False,"stg_stop_thread",4314204) 0 (Just (ItUnresolved
4314204 (InfoTableHeader 0 CtSTOP_FRAME [Ctf_BTM] 0)))
Process ended.


More information about the Cvs-ghc mailing list