Debugging 查找位置<&书信电报;环路>&燃气轮机;发生了

Debugging 查找位置<&书信电报;环路>&燃气轮机;发生了,debugging,haskell,infinite-loop,Debugging,Haskell,Infinite Loop,如果我们得到一个,这意味着Haskell成功地检测到了一个无限循环。有没有办法让ghc告诉我们这个循环发生在哪里?Haskell似乎应该在某个地方有这些信息。使用-prof和-fprof auto编译你的应用程序(如果你使用的是Cabal,请使用--启用可执行评测和--ghc选项=-fprof auto),然后使用+RTS-xc运行它。当发生错误时,它将打印堆栈跟踪。这会帮助你缩小你的范围 例如: ➜ haskell cat loop.hs myFun :: Int myFun =

如果我们得到一个
,这意味着Haskell成功地检测到了一个无限循环。有没有办法让ghc告诉我们这个循环发生在哪里?Haskell似乎应该在某个地方有这些信息。

使用
-prof
-fprof auto
编译你的应用程序(如果你使用的是Cabal,请使用
--启用可执行评测
--ghc选项=-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>>
➜  哈斯克尔猫环
myFun::Int
我的乐趣=
设g=g+1
g+10
main=print myFun
➜  haskell ghc loop.hs-prof-fprof auto
[1/1]编译Main(loop.hs,loop.o)
链接循环。。。
➜  哈斯克尔./loop+RTS-xc
***异常(由于+RTS-xc而报告):(THUNK_静态),堆栈跟踪:
Main.myFun.g,
从Main.myFun打来的电话,
从Main.CAF调用
***异常(由于+RTS-xc而报告):(THUNK_静态),堆栈跟踪:
Main.myFun.g,
从Main.myFun打来的电话,
从Main.CAF调用
循环:

除了已经编写的内容之外:这些循环仅在运行时检测到。检测基于代码,该代码试图计算[由同一线程]已经计算的值。显然,这种情况永远不会发生


如果您正在寻找一个编译器开关来在编译时检测这个。。。你真倒霉。静态地发现递归很容易,但确定递归是否为无限并不容易。

这与停止问题有什么关系?GHC已经告诉我们有一个循环。@sinan抱歉,我以为它想检测无限循环。