[Haskell-cafe] How to debug GHC

Ketil Malde ketil+haskell at ii.uib.no
Fri Sep 2 03:15:45 EDT 2005

Nils Anders Danielsson <nad at cs.chalmers.se> writes:

> My program is failing with head [], or an array bounds error, or some
> other random error, and I have no idea how to find the bug. Can you
> help?
>     Compile your program with -prof -auto-all (make sure you have the
>     profiling libraries installed), and run it with +RTS -xc -RTS to

I also have experienced - ahem - varying results with -xc.  My
solution is to use 'ghc -cpp' instead, and something like the following:

  import Prelude hiding (head,read)

  /* ugly, but a real functon would block subsequent imports */ 
  #define BUG(C_,M_) (error ("Program error - '"++C_++"' failed: "++M_++". Location: "++__FILE__++" line: "++ show __LINE__))

  #define head (\xs -> case xs of { (x:_) -> x ; _ -> BUG("head","empty list")})
  #define at (let {at_ (y:_) 0  = y; at_ (y:ys) n = if n>0 then at_ ys (n-1) else BUG("at","negative index"); at_ _ _ = BUG ("at","index too large")} in \a x -> at_ a x)
  #define read (\s -> case [ x | (x,t) <- reads s, ("","") <- lex t] of { [x] -> x ; [] -> BUG("read","no parse"); _ -> BUG("read","ambigous parse")})
  #define fromJust (\x -> case x of Just a -> a; Nothing -> BUG("fromJust","Nothing"))
  #define undefined (error ("Hit 'undefined' in "++__FILE__++", "++show __LINE__))

This redefines a bunch of "difficult" functions to report file name
and line number, instead of just an anonymous error message. It won't
work for (infix, non-alpha) operators -- like array indexing -- or
identifiers with apostrophes, unfortunately.

If I haven't seen further, it is by standing in the footprints of giants

More information about the Haskell-Cafe mailing list