我正在寻找替换loch(和它的预处理器)的东西,因为它不能用ghc 7编译。
具体来说,如果调用了error
,那么我想尽可能方便地找出调用它的位置(行号和堆栈跟踪会很好)。
答案 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))