2011-07-05 11 views
13

私は現在、私のディプロマテーゼのためにHaskellで実装したアルゴリズムをデバッグしています。私は多くを持っているので、マップ内の要素ではないHaskellでスローされたエラーのバックトレースを表示する方法

:Map.find:例外***ほとんどの入力に対して正しく動作しているようですが、まだ私は、GHCはエラー

を投げる作る1つの入力を見つけ私のコードでルックアップをマップするには、このエラーを投げるラインを見つける必要があります。私はthis guideを読んで、私はフラグfbreak-on-exception(および-error)を設定するものの、全てのGHCiのは、私はテストがあるんだ機能をトレースした後、私を与える:

[...]> :trace test 
[...] 
Stopped at <exception thrown> 
_exception :: 
    e = GHC.Exception.SomeException (GHC.Exception.D:Exception _ 
                 (GHC.Show.D:Show ...) ....) 
           (GHC.Exception.ErrorCall ['M',....]) 
Unable to list source for <exception thrown> 
Try rerunning with :trace, :back then :list 
[<exception thrown>] [...]> :history 
Empty history. Perhaps you forgot to use :trace? 

再び:traceをしようとすると、いずれか助けていないようです。

誰かが間違っていることを教えてもらえますか、違反行を見つける別の方法を提供できますか?前もって感謝します!

PS:GHCバージョン7.0.3を使用しているため、リンクされたガイドが適用されます。

+0

もっと良い解決方法はこちら[こちら](http://stackoverflow.com/questions/8595077/how-can-i-get-the-position-where-error-was-called) – Simon

答えて

9

多分これがお手伝いします

http://www.haskell.org/haskellwiki/Debugging

湖は、ソース位置例外やエラーを発生させるためのアサート以上のラッパーを提供します。 import Debug.Trace.Location、その後にプリプロセッサで再コンパイル:
...
追加

 $ ghc A.hs --make -pgmF loch -F -no-recomp 
    [1 of 1] Compiling Main    (A.hs, A.o) 
    Linking A ... 
    $ ./A 
    A: A.hs:14:14-19: Maybe.fromJust: Nothing

他のヒントは、例えばのように、ウィキにもありますSafe-Libraryを使用してください。

+0

ありがとうHal! 残念ながら、Lochはもはやサポートされていないようですが、少なくとも現代版のGHCではコンパイルされません。 しかし私はあなたのWikiリンクで他の方法を試みます。 –

+0

さて、Safe-Libraryを見て、 'Data.Map。(!)'のすべてのインスタンスを 'findWithDefault(error" line nr ")'に置き換えてバグを見つけました。再度、感謝します! –

+1

素晴らしい! :)私はちょうどGHC7上に構築するように見えるhttp://hackage.haskell.org/package/lochththを見つけました。 – hal

関連する問題