【发布时间】:2013-09-18 15:16:30
【问题描述】:
在像gdb 这样的传统命令式调试器中,可以使用SIGINT 中断程序执行,检查程序状态,并最终恢复执行。
虽然 GHCi 允许使用 -fbreak-on-exception 在任意点中断程序执行,但尝试使用 :continue 继续执行只会导致解释器继续执行异常处理程序并终止程序,
> let main = findCureForCancer
> :set -fbreak-on-exception
> :trace main
[twiddle thumbs]
[why is this taking so long?]
[maybe something is wrong, I better see what it's doing]
^CStopped at <exception thrown>
_exception :: e = GHC.Exception.SomeException
GHC.IO.Exception.UserInterrupt
> :hist
...
[ahh, looks like this will just take a bit longer]
> :continue
[program should keep running]
是否有可能在使用 GHCi 调试器戳了一下之后中断执行并仍然恢复执行?
【问题讨论】:
-
不是问题的真正答案,但可能是您等待答案时的一种解决方法/有趣的消遣:hackage.haskell.org/packages/archive/continue/0.2.0/doc/html/…
-
另一种有趣的可能性(我必须阅读更多内容才能知道它是否也是一个有前途的)是执行以下操作:设置信号处理,进入 y/n 提示;如果
no,继续程序;如果y,则抛出异常。如果抛出异常,您将陷入调试器;然后,您可以退后一步,从那里继续,选择y,然后继续执行(在调试器周围戳了一下之后)。有趣的是,这个可能起作用的原因是因为 IO 的不确定性......
标签: debugging haskell ghc ghci