中断后继续在GHC中调试

时间:2013-08-29 07:11:08

标签: debugging haskell infinite-loop ghc

我在Haskell中有一个非终止表达式。我想调试并检查它没有终止的原因。我学到的一种技术是在GHCi中使用以下内容:

:set -fbreak-on-exception
:trace nonterminating_expression
^C
:hist 50

所以我可以看到在无限计算中运行的指令。问题是我想用:step继续计算,忽略中断。我能这样做吗?

用于调试非终止计算的任何其他解决方案? (历史大于50条记录或其他实践来帮助完成任务。)

1 个答案:

答案 0 :(得分:1)

我过去做过的一件事就是每当按一个键时都会使用unsafePerformIO来打破:

假设t是你的原始表达式,在表达式中插入x:

import System.IO
import System.IO.Unsafe

t  i = do print i;    t  (i+1)
t2 i = do print i; x; t2 (i+1)

x = do r <- hReady stdin
       if r then do a<-hGetChar stdin
                    print a -- break on this line
            else print "" 

然后在ghci提示符下:

*Main> :break 9
*Main> t2 0

按键盘键

*Main> :cont

恢复离开的地方。