Hi Michael, On 6/14/06, Michael Marte <marte@pms.informatik.uni-muenchen.de> wrote:
I wonder whether it is possible to print a "closure trace" similar to a stack trace in procedural programming. Say we have two modules A and B:
I wrote small (external) utility that does something like that for ghc-built binaries. It can print traces on user defined breakpoints. As there isn't much use for it, I haven't played with a while, but it might help or provide starting point. darcs get http://tamelambda.net/darcs/tracer/ (requires ghc 6.4.2 and Windows to compile and use) Example output for tracing "lines", of a program something like this: getContents >>= mapM_ putStrLn . lines Trace: Data.List.lines + 0 <CtFUN_STATIC> stg_upd_frame + 0 <CtUPDATE_FRAME> GHC.Base.map + 108 <CtRET_VEC_SMALL> stg_upd_frame + 0 <CtUPDATE_FRAME> GHC.Base.foldr + 76 <CtRET_VEC_SMALL> stg_upd_frame + 0 <CtUPDATE_FRAME> stg_ap_v + 0 <CtRET_SMALL> GHC.IOBase.bindIO + 46 <CtRET_SMALL> GHC.TopHandler.runMainIO + 126 <CtRET_SMALL> stg_catch_frame + 0 <CtCATCH_FRAME> stg_noforceIO + 0 <CtRET_SMALL> stg_stop_thread + 0 <CtSTOP_FRAME> The output isn't too pretty, but it is often possible to see where calls to, say error occur. Unfortunately (for tracing) ghc aggressively inlines (and libraries have RULES-pragmas) functions. That causes traces to have big "holes" in them. Best regards, --Esa