2013-09-03 18 views
11

「コールスタック」の近似を得るために、いくつかの関数を自動的に「マーク」するツールはありますか?デバッグhaskell:各呼び出しで関数の名前を表示

実際には、それぞれの機能の前に追加することなく、fct = Debug.trace "fct" $ ...と書くことで、同じような動作をしたいと思います。

私はプロファイリングが-fprof-autoと似たようなことを知っていますが、アプリケーションの実行中に表示する必要があります。

私は無限ループを持ち、このディスプレイを持っているとすぐにどの機能が故障しているかをすぐに見ることができます。 hlistとブレークポイントの使用は、サイクル内の関数の名前を知っている必要があるため、実際には役に立ちません。

+1

あなたは「確率的なデバッグ」技術を知っていますか?プログラムの実行を開始すると、いつでもデバッガを起動することができます。あなたはおそらく関数に(おそらく、ある関数で停止する確率はその関数で費やされた時間に関係しているので)計算に最も時間がかかるでしょう。 –

+0

これは、GHCiデバッガのドキュメントで推奨されているものです(最初に-fbreak-on-exceptionを設定する必要があります)。しかし、私が思い出す限り、前回使用したときはうまく機能せず、何が起きているのかを知るために関数名の前にそれぞれの関数を追加しなければなりませんでした。 –

答えて

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 
+0

それはどんな種類のCPPですか? '__FILE__ ++": "++ show __LINE__' ;-)しかし、それはとてもクールです! –

+1

@SassaNFこれはファイル名と行番号のCPPマクロを持つhaskellです。 CPPは単なるマクロシステムであり、特定の言語でマクロを実行する必要はありません。 –

+0

何百もの機能を持っていてもそれでも痛みはありますが( –

関連する問題