プログラムが実行され、 "Divide by zero"というメッセージでクラッシュした場合、このエラーがコード内でどこで生成されたかを特定する最良の方法は何ですか?ghc 7.10.3でゼロ除算時にスタックトレースを生成する方法は?
答えて
にはコールスタックがないため、GHCはスタックトレースをサポートしていません。あなたができる最善の方法は、基本モジュールGHC.Stack
のシミュレーションされたスタックトレースマシンを使用することです。
GHC 7.8以降では、および7.10.3でこのように利用できる、GHC.Stack
は通常のビルドにerror
のように作用するが、SCCのアノテーションを使用しています
errorWithStackTrace :: String -> a
公開する(例えば、--fprof-auto
から)おおよそのスタックトレースを構築しますプロファイルされたビルドでこれをサポートするには、プロファイリングを有効にして再コンパイルする必要があります。カバールを使用している場合は、実行することができます
cabal configure --enable-library-profiling --enable-executable-profiling
と再構築することができます。
GHC 8.0以降、errorWithStackTrace
は廃止され、コールサイト生成のサポートはHasCallStack
機材によって提供されています。 GHC.Stack
ドキュメント、
機能から、今引用
は
HasCallStack
制約とその呼び出しサイトを要求することができます。例えば、我々はその呼び出しサイトを取得しますerror
の変種としてerrorWithCallStack :: HasCallStack => String -> a
を定義することができます。
callStack
でerrorWithCallStack
のコールスタックにアクセスできます。我々はerrorWithCallStack
を呼び出す場合errorWithCallStack :: HasCallStack => String -> a errorWithCallStack msg = error (msg ++ "n" ++ prettyCallStack callStack)
したがって、私たちは、エラー・メッセージと一緒にフォーマットされたコールスタックを取得します。
>>> errorWithCallStack "die" *** Exception: die CallStack (from HasCallStack): errorWithCallStack, called at <interactive>:2:1 in interactive:Ghci1
(私はmsg ++ "\n"
を意味して推測しているが、"n"
が書かれているものです。)
あなたがGHC 7.8でいくつかの非常に限られたスタックトレースのサポートを得ることができますが、私はアップグレードをお勧めします可能であればGHC 8へのサポートが大幅に改善されました。いずれにしても、他の言語に慣れているものではありませんが、何もないよりも優れています。
最新のGHCリリースでは、 'error' *は' errorWithCallStack'です。そして、ドキュメントは、あなたが 'HasCallStack'を使うよりもプロファイリングされたビルドからより良いスタックトレースを得ることを示唆しているようです。私はまだプロファイルされた方法を試していない。 – dfeuer
@dfeuer GHC 8.2.1 with -' -prof'がより良いコールスタックを生成すべきであるという主張を正しく理解していますか?そうではないようです:https://gist.github。com/TomMD/7d1fb8dc762fc37bf80b7b7dd447e29a –
( 'stack build --profile'を介して)プロファイリングが有効になっていても、追加のコンテキストなしで「ゼロで割ります」というエラーメッセージしか表示されません。たとえば、分割操作( '/'や '\' div \ '')が数十の呼び出しサイトに現れるコードベースがあるとしましょう。実行時に「ゼロで割る」というエラーメッセージが表示され、それらのコールサイトのどれもがエラーの原因と同じように思われる場合、デバッグにどのようにアプローチしますか? 1つの注釈付きバージョンで分割操作の各インスタンスをスワップする必要があります(せいぜい、問題のある呼び出しサイトをバイナリ検索で絞り込む必要があります)。 – kostmo
- 1. ハスケル:GHCでハッピー1.19.5使用時の問題7.10.3
- 2. 実行時エラー - ゼロ除算
- 3. ゼロで除算
- 4. Prometheusでゼロ除算を正常に回避する方法
- 5. C++でfloat値を生成する除算を得る方法
- 6. ゼロ除算の処理方法
- 7. ハスケルでゼロ除算
- 8. コードでゼロ除算
- 9. JavaScriptスタックトレースを生成するには?
- 10. ゼロ除算C++での除算
- 11. SQLゼロ除算
- 12. ゼロで除算を防止するNullIf()
- 13. ゼロで除算を置換する
- 14. スタンドアロンプログラムでゼロ除算
- 15. M0 +デバイスでゼロ除算
- 16. ゼロ除算警告
- 17. ゼロ除算を防ぐには?
- 18. このコードはなぜゼロで除算されますか?
- 19. PostgreSQLによる除算ゼロによる除算
- 20. numpyゼロで除算する結果
- 21. java.lang.ArithmeticException:ゼロで除算するエラー
- 22. SSRS式でゼロ除算を避ける
- 23. なぜゼロ除算で除算しないのですか?
- 24. 整数除算またはゼロでモジュロ
- 25. 整数の除算は常にゼロ
- 26. GHCでは、実際に出力を生成せずにコンパイルをチェックできる方法はありますか?
- 27. 演算子を使用してゼロを除外する方法は?
- 28. 複素数を除算しようとするとゼロで除算する
- 29. PostgreSQLでゼロ除算を避けるために文を追加する適切な方法は何ですか?
- 30. オドゥ9 qwebフロート除算ゼロ
"ベスト"の資格はありますか?一般的に、スタックトレースは、怠惰な関数型言語ではあまり意味がありません。おそらく、あなたの "最良の"賭けは、プロファイリングを有効にすることです。それ以外の場合は、['CallStack'](https://hackage.haskell.org/package/base-4.10.0.0/docs/GHC-Stack.html)を使用してください。 – user2407038
私は、エラーが発生したソースコード内の行を識別するメソッドを決めると思います。プロファイリングを有効にすると、いくつかの余分なパラメータ(あるもの)で 'stack build'を実行することができますか?そして、プログラムを実行すると、エラーの詳細が表示されます。 – kostmo