1

ガード通知を行うために、プログラムがこのハンドラーでキャッチされるよりも、いつ、どのような場合に失敗するかが必要です。

ハンドラーを通過せずにプログラムがクラッシュしないようにするために登録する必要がある下部ハンドラーまたはハンドラーのリストはありますか?

ubuntuで実行し、ubuntuにのみ必要なソリューションは、例外メモリ割り当てなどのあらゆる種類の障害が必要です...

4

7 に答える 7

2

C++ は仮想サンドボックスで実行されないため、これをキャッチするための言語への組み込みはありません。確かに (たとえば、例外を使用して) 自分で作成できますが、これを基礎から作成するのはコード次第です。

ただし、実行しているプラ​​ットフォームには、使用できるものがある場合があります。たとえば、Windows には がありSetUnhandledExceptionFilterます。

もちろん、これはすべて、「クラッシュ」が何を意味するかによって異なります。

于 2012-08-24T13:29:15.167 に答える
2

プロセスの起動時に、 を呼び出しますfork。親を使用して子を監視します。致命的なエラーが発生した場合、プロセスは終了します。これを検出し、それが発生したときに必要なことは何でも行うことができます。子が正常に終了したい場合は、終了する前に単に親を殺すことができます。

于 2012-08-24T13:33:10.297 に答える
2

通常のプログラム終了の場合は、ハンドラを に登録できますstd::atexit()

キャッチされていない例外が原因でプログラムが終了する場合/... でハンドラーを登録できますstd::set_terminate。「例外メモリ割り当て」がstd::bad_alloc例外を意味する場合、このハンドラーをトリガーする必要があります。

于 2012-08-24T13:33:37.987 に答える
2

簡単な答えは、プログラム内のすべてのエラーを処理できる単一のポイントはないということです。try/catch (...)at inを追加して、入力後、完了前にmain発生する例外を処理できます。C++mainのハンドラーを追加することもできます。terminate次に、OS に応じて、他の状況を別の方法で処理する必要があります (無効なメモリ参照は、SIG_SEGV を処理することによって unix/linux で処理できますが、Windows では機能しません --AFAIK; 他のいくつかのエラーは、異なるシグナルをトリガーする可能性があります。処理されない...) さらに、まだ見過ごされているエラーがあるかもしれません (たとえば、無効なメモリ アクセスがたまたま有効なメモリ アドレスにヒットしたとします... プログラムは正しくないでしょうが、エラーは検出されない可能性があります)。

于 2012-08-24T13:33:56.853 に答える
1

SIGABRTLinux の場合Signalに応答する必要があります。callbackアプリが SIGABRT シグナルを受け取るたびに呼び出されます

signal(SIGABRT, &callback);

SIGSEGVなど、さまざまなシナリオにさまざまなシグナルがありSIGBUS、フックする必要があります。それらを異なるコールバックにフックして、どのエラーが何に入るかを確認することをお勧めします。複数の問題が原因で 1 つのエラーが発生する可能性があるためです。

于 2012-08-24T13:29:45.797 に答える
0

いいえ。たとえば、プロセスが でkill編集されている場合SIGKILL、ハンドラは実行されません。

PS 参考までに、これはSPOFとは関係ありません。

于 2012-08-24T13:27:11.453 に答える
0

try/catch(...)ブロックを最上位に配置して、すべての例外をキャッチできます。しかし、プログラムを終了させる方法は他にもあり、これらをキャッチする方法は移植性がありません。Unix ベースのシステムでは、シグナル ハンドラを作成する必要がありますが、それでも停止しませんkill -9

于 2012-08-24T13:30:02.013 に答える