42

C++ で SIGABRT フォールトが発生する可能性のある原因を教えてください。

4

3 に答える 3

26

ウィキペディアによると、

SIGABRTabortで定義されている libc 関数を呼び出すときに、プロセスによってプロセス自体に送信されstdlib.hます。信号はSIGABRTキャッチできますが、ブロックすることはできません。シグナル ハンドラが戻ると、開いているすべてのストリームが閉じられてフラッシュされ、プログラムが終了します (必要に応じてコアをダンプします)。これは、abort呼び出しが返されないことを意味します。この特性のため、サポート ライブラリで致命的な状態 (現在の操作を完了できないが、メイン プログラムが終了する前にクリーンアップを実行できる状況) を通知するためによく使用されます。アサーションが失敗したときに使用されます。

つまり、コードが をabort直接呼び出したり、SIGABRTを介してシグナルを送信したりraiseせず、失敗したアサーションがない場合、その原因はサポート ライブラリ (libc の可能性があります) で内部エラーが発生したことです。プログラムの詳細を提供していただければ、考えられる原因を提案できる場合があります。さらに良いことに、コアを調べたり、デバッガーでプログラムを実行したりすると、スタック トレースを収集できるはずです。これにより、どのライブラリーがプログラムを中断させたかがわかります。

(システム上の別のプログラムがあなたのプログラムを送信している可能性もありますSIGABRTが、ほとんどの場合、ほとんどありません。)

于 2012-06-24T22:32:46.313 に答える
10

これは通常、ライブラリが内部エラーに遭遇したときに発生し、続行できないため、abort() を呼び出します。これは、データ構造の 1 つ (たとえば、libc の関数に属するもの) を上書きしたときに発生する可能性があります。したがって、これはたとえば、何かを上書きしたため、libc 呼び出しである可能性があります。そして、アサーションの失敗と呼ばれる、続行または処理が不可能なため、アプリケーションを終了する必要があります。

于 2012-06-22T17:31:46.170 に答える
6

実際には、これは通常 assert マクロによってトリガーされます。

char* foo = NULL;
assert( foo != NULL );

SIGABRTになります

于 2012-06-24T22:39:47.220 に答える