如果程序运行并且崩溃并显示消息"除以零",识别代码中生成此错误的位置的最佳方法是什么?
答案 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以获得更好的支持。无论哪种方式,它都不会成为你从其他语言习惯的东西,但它总比没有好。