【问题标题】:Break and continue in GHCi debugger without use of breakpoints在 GHCi 调试器中中断并继续,而不使用断点
【发布时间】: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


【解决方案1】:

我不是 GHC 专家,但我非常相信稳定的 GHC 和当前的 GHC HEAD 都不支持这一点。 manual 没有提及它,我已经找到了 the current HEAD 以确保没有任何未记录、注释掉或包围在 #if FALSE 中。 (如果您有兴趣,当前执行的 GHCi 命令在 /ghc/InteractiveUI.hs:136 中定义。)至少自 2013 年 1 月以来,mailing list 上没有发布任何关于此的内容,也没有人提交或关闭有关它的错误(见relevant bug tracker search)。

这听起来像是一个有用的功能——你会file a feature request吗?

【讨论】:

    猜你喜欢
    • 2013-09-01
    • 2017-10-11
    • 1970-01-01
    • 2011-05-11
    • 2010-09-16
    • 2012-12-08
    • 2020-12-30
    • 2015-03-06
    • 2022-01-12
    相关资源
    最近更新 更多