2016-04-05 8 views
1

私のシステムは何時間も問題なく動作します。
突然、それは無効な浮動小数点例外がスローされます。
それは発生しません:
- デバッガなしに、例外がスローされデバッガなしで "無効な浮動小数点"例外の起点を見つける方法は?

がどのように決定することができ、すべてのコンピュータで - デバッガ
で実行中に?
私は、ロギングと例外のトレースの組み合わせにより、デルファイ6

+2

madExceptをプロセスに挿入し、結果のバグレポートからスタックトレースを読み取ります –

答えて

4

を使用しています。 これは、システムをデバッグ情報でデプロイする必要があることを意味します。あなたにとって問題はないようですが、時にはボックスソフトウェアの問題です。

があり、それを行うためのツールがたくさんありますが、そうでないかもしれない、すべてはまだデルファイ-6互換性があります。いくつかの名前には:

だからあなたがTApplicationExceptProcまたは任意に(デフォルトの例外ハンドラを変更する必要があります - で、これらのツール彼らのソースはあなたにそれを行う方法を示すだろう)と浮動小数点例外を記録する(あなたはほとんど興味がないだろうすべての可能な例外)。ロギングフレームワーク:

これは別の問題をもたらします。上のライブラリの中には既にそれを持っているものもあれば、余分なライブラリが必要なものもあります。あなたはすでにそれを今必要としており、それはもっと後で必要になります。

今、あなたはしばらくの間、あなたのサービスを実行し、それは彼らのスタックトレースを持つすべてのFP関連の例外を保存し続けます。いくつかの最適化を無効にしてコンパイルした場合(「常にスタックフレームを生成する」のように)、途中のローカル変数やパラメータも表示されるでしょう。

あなたはラッキー再場合 - あなたは、エラーが発生したかを理解するために十分だろう。しかし、ほとんどの場合、即時のエラー状態が表示されますが、失敗した初期仮定からどのように発展したかはわかりません。

は、その場合には、あなたは、少なくとも(あなたは一つであると思います知っているいくつかの類似したエラーまたは数パス)エラーにスタックトレース(実行パス)を持っています。 その時点で、主な作業をロギングに移行します。実行パスを知ることで、関心のある関数のパラメータとローカル変数を実行パスに沿ってすべてログに記録し、ログに記録される例外(および例外が発生した場合の値の正常値)の前にそれらの変数が異常値を取得する方法を確認できます。

コールスタックの下に検索を展開し、最初にログを出力するparamsとvarsを追加し、呼び出しスタックに直接はないロギングにいくつかのside-byルーチンを追加する必要があります例外の前に呼び出され、エラーの前にローカル変数値に影響を与えていました。

関連する問題