Ответ 1
Скомпилируйте приложение с помощью -prof
и -fprof-auto
(если вы используете Cabal, используйте --enable-executable-profiling
и --ghc-options=-fprof-auto
), а затем запустите его с помощью +RTS -xc
. Он будет печатать трассировку стека при возникновении ошибок. Это должно помочь вам сузить область действия.
Пример:
➜ haskell cat loop.hs
myFun :: Int
myFun =
let g = g + 1
in g + 10
main = print myFun
➜ haskell ghc loop.hs -prof -fprof-auto
[1 of 1] Compiling Main ( loop.hs, loop.o )
Linking loop ...
➜ haskell ./loop +RTS -xc
*** Exception (reporting due to +RTS -xc): (THUNK_STATIC), stack trace:
Main.myFun.g,
called from Main.myFun,
called from Main.CAF
*** Exception (reporting due to +RTS -xc): (THUNK_STATIC), stack trace:
Main.myFun.g,
called from Main.myFun,
called from Main.CAF
loop: <<loop>>