x86 Linux で浮動小数点例外 (シグナル) を C++ 例外に変換することは可能ですか?
これはデバッグ用であるため、移植性や不完全性は問題ありません (たとえば、すべてのデストラクタが呼び出されることが 100% 保証されていない場合)。
x86 Linux で浮動小数点例外 (シグナル) を C++ 例外に変換することは可能ですか?
これはデバッグ用であるため、移植性や不完全性は問題ありません (たとえば、すべてのデストラクタが呼び出されることが 100% 保証されていない場合)。
C++ 標準ライブラリの実装が TR1 関数
fetestexcept
をサポートferaiseexcept
している場合feclearexcept
(私のものはまだサポートしていないため、これをテストできません)、5 種類の浮動小数点エラーを検出して、必要な例外をスローできます。
これらの機能の説明については、こちらを参照してください。
サンプル コードを使用したこれらの関数の優れた説明については、The C++ Standard Library Extensions: A Tutorial and Reference by Pete Becker (ISBN-13: 9780321412997)のセクション 12.3「Managing the Floating Point Environment」もお勧めします。
gcc オプション-fnon-call-exceptionsが役に立つかもしれません。ただし、それに関するドキュメントが見つからなかったため、マイレージは異なる場合があります。
シグナルと例外の仕組みにより、シグナルがスローされたときにすぐに実行することはできません。例外は、シグナル ハンドラーが呼び出されたときに真ではないスタックの特定の側面に依存しています。
シグナル ハンドラーでグローバル変数を設定し、プログラムの重要なポイントでこれをチェックして、設定されている場合は例外をスローすることができます。ただし、これはスローされた例外に関する正確な情報を提供しません。
既成の解決策はありませんが、シグナルを見ることができるものの1つです(それらからC++例外を安全にスローできるかどうかはわかりませんが、とにかくデバッグに役立つはずです.)
SIGFPE のシグナル ハンドラーをインストールし、それをデバッグ目的で使用できます。
基本的な考え方は、浮動小数点例外用の適切なシグナル ハンドラをインストールすることです。シグナルハンドラー内で、例外をスローできます(または、ユーザー定義のシグナルを別のプロセスに送信して例外を発生させるか、別のスレッドにメッセージを送信して同様のことを行うなど)。実際に例外をスローする方法はいくつもあります - 主なことはシグナルを処理することです。