Serge D. Mechveliani wrote:
Simon P. Jones wrote today about the -xc option to help with
finding who called fromJust Noting.
Now, I see in the GHC Guide:
------------------------------------------------------------------
-xs
(Only available when the program is compiled for profiling.) When an
exception is raised in the program, this option causes the current
cost-centre-stack to be dumped to stderr.
This can be particularly useful for debugging: if your program is
complaining about a head [] error and you haven't got a clue which bit of
code is causing it, compiling with -prof -auto-all and running with
+RTS -xc -RTS will tell you exactly the call stack at the point the error
was raised.
The output contains one line for each exception raised in the program
(the program might raise and catch several exceptions during its
execution), where each line is of the form:
< cc1, ..., ccn >
...
---------------------------------------------------------------------
So, I `made' the project under -prof -auto-all and run
./Nat1 +RTS -xc -RTS.
It prints
...
(3, Ind n,
(formula1
[(1, IndMember,
<Data.Maybe.CAF>Nat1: Maybe.fromJust: Nothing
This does not help to see who called for fromJust in this case.
Maybe this is in Nat.prof ? And it is empty.
Adding -p does fill Nat.prof with a lot of statistics,
but I guess, this statistics cannot help with the fromJust question.
Can people, please, comment some more on this -xc usage?
-xc doesn't always work well, as you noticed. In particular, if the exception
is part of a CAF, then you don't get to see the call stack. Exceptions are
often lifted into CAFs, because in a function definition like this:
fromJust Nothing = error "..."
fromJust (Just a ) = a
it makes sense to transform this to
_fail = error "..."
fromJust Nothing = _fail
fromJust (Just a) = a
because then we can inline fromJust without duplicating the error and the
string. So I suspect this is exactly what is happening. You might be able to
work around it by defining a local definition of fromJust, maybe adding a
NOINLINE pragma to it.
The fact that cost-centre-stacks don't give you the call stack of a CAF is
partly a feature - when considering the profiled costs of a CAF it would be
wrong (arguably) to attribute them to the first call site that evaluates the CAF.
Anyway, we recognise this is a problem (and not the only problem with CCSs).
One day we'll overhaul CCSs and make them work properly!
Cheers,
Simon
_______________________________________________
Glasgow-haskell-users mailing list
Glasgow-haskell-users@haskell.org
http://www.haskell.org/mailman/listinfo/glasgow-haskell-users