【问题标题】:Continue debugging in GHC after interrupt中断后在 GHC 中继续调试
【发布时间】:2013-09-01 12:03:31
【问题描述】:

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

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

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

还有其他用于调试非终止计算的解决方案吗? (超过 50 条历史记录或其他有助于完成任务的实践。)

【问题讨论】:

  • 你熟悉如何在任意代码中设置断点吗?我会在无限循环中的某个地方放一个中断,然后用它来逐步完成迭代。
  • 是的,但问题是我会接到很多假电话。例如,我想我已经知道了无限循环的位置,但是每个函数调用只有 1% 的时间会导致无限循环。

标签: debugging haskell infinite-loop ghc


【解决方案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

从上次中断的地方继续。

【讨论】:

    猜你喜欢
    • 2010-12-15
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-05
    • 2012-10-18
    相关资源
    最近更新 更多