Debugging 如何调试Haskell中的无限递归?

Debugging 如何调试Haskell中的无限递归?,debugging,haskell,profiling,Debugging,Haskell,Profiling,如何使用GHC的评测工具调试这个(显然)有缺陷的程序?程序在frobnite的第二个子句中输入无限递归 ——Foo.hs Frobnite::Show a=>可能是->字符串 Frobnite Nothing=“” 浮点数x=浮点数x的情况 “->”X” _->显示x main::IO() main=print(frobnite(只是“”::可能是字符串)) 这个例子看起来可能有些做作,但实际上是我今天遇到的一个真正bug的精简版本 在命令式语言中,错误是显而易见的,因为堆栈跟踪会说类似于fr

如何使用GHC的评测工具调试这个(显然)有缺陷的程序?程序在
frobnite
的第二个子句中输入无限递归

——Foo.hs
Frobnite::Show a=>可能是->字符串
Frobnite Nothing=“”
浮点数x=浮点数x的情况
“->”X”
_->显示x
main::IO()
main=print(frobnite(只是“”::可能是字符串))
这个例子看起来可能有些做作,但实际上是我今天遇到的一个真正bug的精简版本

在命令式语言中,错误是显而易见的,因为堆栈跟踪会说类似于
frobnite->frobnite->frobnite->frobnite->…
。但在哈斯克尔,人们怎么会发现这一点呢?如何将责任缩小到这一特定功能上

我尝试了以下类似的方法:

ghc-fforce recomp-rtsopts-prof-fprof auto Foo.hs
/Foo+RTS-M250M-i0.001-h
hp2ps-cfoo.hp
如果添加了
-M250M
标志以确保其不会导致机器死机,
-i0.001
会增加分析频率,以尝试捕捉正在运行的溢出(发生得非常快)

这就产生了这样一个毫无帮助的情节:


此图中没有明显的溢出。y轴甚至不超过一个兆字节!我做错了什么?

如果您使用
+RTS-xc
运行程序,如果您的程序遇到错误,GHC将打印堆栈跟踪。您只需等待出现内存错误,尽管我相信某些版本的GHC几乎会无限期地消耗内存。
+RTS-h
提供了堆配置文件。不要惊讶它没有显示堆栈使用…@Carl:我在前面写问题时意识到了这一点,但我想问一下,因为我不知道如何调试堆栈溢出。@user2407038:这个标志非常有用,谢谢!但是,我发现它需要与
-auto-all
结合起来才能产生有用的结果。您可以随意添加它作为答案。查找无限循环(中断它并检查堆栈)的方法对于查找非无限循环(普通的旧慢度)也很有用。多打断几次就行了。如果您看到可以在两个或多个中断上删除的内容,那么删除它将给您带来健康的加速。