如何获得调用错误的位置?

时间:2011-12-21 19:16:12

标签: haskell

我正在寻找替换loch(和它的预处理器)的东西,因为它不能用ghc 7编译。

具体来说,如果调用了error,那么我想尽可能方便地找出调用它的位置(行号和堆栈跟踪会很好)。

4 个答案:

答案 0 :(得分:12)

您可以使用-xc RTS选项,如this page所述;你需要使用分析支持编译你的程序,输出非常难看,但是它可以工作。

这应该这样做:

$ ghc --make -prof -auto-all myprog.hs
$ ./myprog +RTS -xc

从技术上讲,这仅提供成本中心堆栈,而不是真正的堆栈跟踪。改进的堆栈跟踪支持是coming in GHC 7.4

答案 1 :(得分:5)

如果这是在你正在使用的代码中使用,并且你可以容忍使用Template Haskell,the placeholders package是一种可爱而简单的方法来做这样的事情。但是,它无法帮助您找到实际error表达式的位置,只会使用自己的error类函数。

答案 2 :(得分:5)

使用GHC-7进行构建非常简单。这只是6.12附带的Control.Exception更改,简单的解决方法是将Exception中的SomeException类型更改为Debug.Trace.Location,第70行并在行中添加表达式类型签名144.将base依赖关系限制在.cabal文件中的>= 4.2 && < 4.6(碰撞版本),你就可以了。

答案 3 :(得分:3)

快速解决方法是Control.Exception中的assert函数。但是,它比error稍微笨拙。

警告:如果使用优化(ghc -O1-O2等进行编译,则会以静默方式忽略所有断言。

示例:

import Control.Exception

main = do
    print (42 + (assert True  17)) -- adds 42 and 17
    print (42 + (assert False 21)) -- crashes

输出:

59
test.hs: /tmp/test.hs:5:18-23: Assertion failed

请注意输出中的行号“5”。

您可以使用Debug.Trace中的trace添加错误消息:

    print (42 + (trace "omg error" $ assert False 21))