如何用ghc 7.10.3除以零生成堆栈跟踪?

时间:2017-08-08 23:40:14

标签: haskell stack-trace partial-functions

如果程序运行并且崩溃并显示消息"除以零",识别代码中生成此错误的位置的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

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

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

errorWithStackTrace :: String -> a

在正常构建中的行为类似error,但使用SCC注释(例如,来自--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以获得更好的支持。无论哪种方式,它都不会成为你从其他语言习惯的东西,但它总比没有好。