找到<< loop >>发生的地方

yon*_*ong 23 debugging haskell infinite-loop

如果我们得到一个<<loop>>,那就意味着Haskell设法检测到一个无限循环.有没有办法让ghc告诉我们这个循环发生在哪里?似乎Haskell应该在某个地方拥有这些信息.

sin*_*nan 24

使用-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>>
Run Code Online (Sandbox Code Playgroud)