1

如果程序运行并崩溃并显示“除以零”消息,那么识别代码中此错误在何处生成的最佳方法是什么?

4

1 回答 1

1

GHC 不支持堆栈跟踪,因为没有调用堆栈。您可以做的最好的事情是使用基本模块中的模拟堆栈跟踪机制GHC.Stack

从 GHC 7.8 开始,因此在 7.10.3 中可用,GHC.Stack公开

errorWithStackTrace :: String -> a

它的作用类似于error正常构建,但使用 SCC 注释(例如, from --fprof-auto)在已分析的构建上构造近似堆栈跟踪。您需要在启用分析的情况下重新编译以支持这一点。如果您使用的是 cabal,则可以运行

cabal configure --enable-library-profiling --enable-executable-profiling

并重建。

从 GHC 8.0 开始,errorWithStackTrace已弃用,机器提供了对呼叫站点生成的支持HasCallStack

现在从GHC.Stack文档中引用,

HasCallStack函数可以使用约束请求其调用站点。例如,我们可以定义

errorWithCallStack :: HasCallStack => String -> a

作为其变体error将获得其调用站点。errorWithCallStack我们可以使用 访问内部的调用堆栈callStack

errorWithCallStack :: HasCallStack => String -> a
errorWithCallStack msg = error (msg ++ "n" ++ prettyCallStack callStack)

因此,如果我们调用,errorWithCallStack我们将在错误消息旁边得到一个格式化的调用堆栈。

>>> errorWithCallStack "die"
*** Exception: die
CallStack (from HasCallStack):
  errorWithCallStack, called at <interactive>:2:1 in interactive:Ghci1

(我猜msg ++ "\n"是故意的,但"n"写的是什么。)

虽然您可以使用 GHC 7.8 及更高版本获得一些非常有限的堆栈跟踪支持,但我建议尽可能升级到 GHC 8 以获得更好的支持。无论哪种方式,它都不会是您在其他语言中所习惯的,但总比没有好。

于 2017-08-09T02:13:47.487 回答