ガード通知を行うために、プログラムがこのハンドラーでキャッチされるよりも、いつ、どのような場合に失敗するかが必要です。
ハンドラーを通過せずにプログラムがクラッシュしないようにするために登録する必要がある下部ハンドラーまたはハンドラーのリストはありますか?
ubuntuで実行し、ubuntuにのみ必要なソリューションは、例外メモリ割り当てなどのあらゆる種類の障害が必要です...
ガード通知を行うために、プログラムがこのハンドラーでキャッチされるよりも、いつ、どのような場合に失敗するかが必要です。
ハンドラーを通過せずにプログラムがクラッシュしないようにするために登録する必要がある下部ハンドラーまたはハンドラーのリストはありますか?
ubuntuで実行し、ubuntuにのみ必要なソリューションは、例外メモリ割り当てなどのあらゆる種類の障害が必要です...
C++ は仮想サンドボックスで実行されないため、これをキャッチするための言語への組み込みはありません。確かに (たとえば、例外を使用して) 自分で作成できますが、これを基礎から作成するのはコード次第です。
ただし、実行しているプラットフォームには、使用できるものがある場合があります。たとえば、Windows には がありSetUnhandledExceptionFilter
ます。
もちろん、これはすべて、「クラッシュ」が何を意味するかによって異なります。
プロセスの起動時に、 を呼び出しますfork
。親を使用して子を監視します。致命的なエラーが発生した場合、プロセスは終了します。これを検出し、それが発生したときに必要なことは何でも行うことができます。子が正常に終了したい場合は、終了する前に単に親を殺すことができます。
通常のプログラム終了の場合は、ハンドラを に登録できますstd::atexit()
。
キャッチされていない例外が原因でプログラムが終了する場合/... でハンドラーを登録できますstd::set_terminate
。「例外メモリ割り当て」がstd::bad_alloc
例外を意味する場合、このハンドラーをトリガーする必要があります。
簡単な答えは、プログラム内のすべてのエラーを処理できる単一のポイントはないということです。try/catch (...)
at inを追加して、入力後、完了前にmain
発生する例外を処理できます。C++main
のハンドラーを追加することもできます。terminate
次に、OS に応じて、他の状況を別の方法で処理する必要があります (無効なメモリ参照は、SIG_SEGV を処理することによって unix/linux で処理できますが、Windows では機能しません --AFAIK; 他のいくつかのエラーは、異なるシグナルをトリガーする可能性があります。処理されない...) さらに、まだ見過ごされているエラーがあるかもしれません (たとえば、無効なメモリ アクセスがたまたま有効なメモリ アドレスにヒットしたとします... プログラムは正しくないでしょうが、エラーは検出されない可能性があります)。
SIGABRT
Linux の場合Signalに応答する必要があります。callback
アプリが SIGABRT シグナルを受け取るたびに呼び出されます
signal(SIGABRT, &callback);
SIGSEGV
など、さまざまなシナリオにさまざまなシグナルがありSIGBUS
、フックする必要があります。それらを異なるコールバックにフックして、どのエラーが何に入るかを確認することをお勧めします。複数の問題が原因で 1 つのエラーが発生する可能性があるためです。
いいえ。たとえば、プロセスが でkill
編集されている場合SIGKILL
、ハンドラは実行されません。
PS 参考までに、これはSPOFとは関係ありません。
try
/catch(...)
ブロックを最上位に配置して、すべての例外をキャッチできます。しかし、プログラムを終了させる方法は他にもあり、これらをキャッチする方法は移植性がありません。Unix ベースのシステムでは、シグナル ハンドラを作成する必要がありますが、それでも停止しませんkill -9
。