C++ で SIGABRT フォールトが発生する可能性のある原因を教えてください。
3 に答える
ウィキペディアによると、
SIGABRT
abort
で定義されている libc 関数を呼び出すときに、プロセスによってプロセス自体に送信されstdlib.h
ます。信号はSIGABRT
キャッチできますが、ブロックすることはできません。シグナル ハンドラが戻ると、開いているすべてのストリームが閉じられてフラッシュされ、プログラムが終了します (必要に応じてコアをダンプします)。これは、abort
呼び出しが返されないことを意味します。この特性のため、サポート ライブラリで致命的な状態 (現在の操作を完了できないが、メイン プログラムが終了する前にクリーンアップを実行できる状況) を通知するためによく使用されます。アサーションが失敗したときに使用されます。
つまり、コードが をabort
直接呼び出したり、SIGABRT
を介してシグナルを送信したりraise
せず、失敗したアサーションがない場合、その原因はサポート ライブラリ (libc の可能性があります) で内部エラーが発生したことです。プログラムの詳細を提供していただければ、考えられる原因を提案できる場合があります。さらに良いことに、コアを調べたり、デバッガーでプログラムを実行したりすると、スタック トレースを収集できるはずです。これにより、どのライブラリーがプログラムを中断させたかがわかります。
(システム上の別のプログラムがあなたのプログラムを送信している可能性もありますSIGABRT
が、ほとんどの場合、ほとんどありません。)
これは通常、ライブラリが内部エラーに遭遇したときに発生し、続行できないため、abort() を呼び出します。これは、データ構造の 1 つ (たとえば、libc の関数に属するもの) を上書きしたときに発生する可能性があります。したがって、これはたとえば、何かを上書きしたため、libc 呼び出しである可能性があります。そして、アサーションの失敗と呼ばれる、続行または処理が不可能なため、アプリケーションを終了する必要があります。
実際には、これは通常 assert マクロによってトリガーされます。
char* foo = NULL;
assert( foo != NULL );
SIGABRTになります