如果程序运行并崩溃并显示“除以零”消息,那么识别代码中此错误在何处生成的最佳方法是什么?
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 以获得更好的支持。无论哪种方式,它都不会是您在其他语言中所习惯的,但总比没有好。