11

是否有一种工具可以自动“标记”某些功能,以便我可以获得“调用堆栈”的近似值。

实际上,我希望有一种类似于您通过编写获得的行为fct = Debug.trace "fct" $ ...而不必在每个函数之前添加它的行为。

我知道分析功能与 -fprof-auto 类似,但我需要在应用程序运行时显示它。

有时,我有无限循环,让这个显示可以立即告诉我哪个功能有问题。使用 hlist 和断点并不是很有帮助,因为您已经必须知道循环中某个函数的名称。

4

1 回答 1

12

这是非常丑陋的东西;-),它只给你行号而不是函数名,但我惊讶地发现它有效,所以我想我会分享它。而且还是聊胜于无。您可以像在过去的 C 时代一样使用 C 预处理器:

{-# LANGUAGE CPP #-}

#define traceLoc trace (__FILE__ ++":"++ show __LINE__)

import Debug.Trace

f 0 = traceLoc $ 1
f n = traceLoc $ g (n-1)
g 0 = traceLoc $ 2
g n = traceLoc $ 2 * f (n-1)    

现在,

*Main> f 3
Test.hs:16
Test.hs:18
Test.hs:16
Test.hs:17
4
于 2013-09-03T16:07:12.613 回答