一部の C++ ライブラリは、エラーの場合に abort() 関数を呼び出します (たとえば、SDL)。この場合、役立つデバッグ情報は提供されません。アボート コールをキャッチして、一部の診断ログ出力を書き込むことはできません。これらのライブラリを書き換えたり再構築したりせずに、この動作をグローバルにオーバーライドしたいと思います。例外をスローして処理したいと思います。出来ますか?
3 に答える
が を呼び出したかのように、 がシグナルを発生さabort
せることに注意してください。次のように、この状況で呼び出されるシグナル ハンドラーをインストールできます。SIGABRT
raise(SIGABRT)
#include <signal.h>
extern "C" void my_function_to_handle_aborts(int signal_number)
{
/*Your code goes here. You can output debugging info.
If you return from this function, and it was called
because abort() was called, your program will exit or crash anyway
(with a dialog box on Windows).
*/
}
/*Do this early in your program's initialization */
signal(SIGABRT, &my_function_to_handle_aborts);
呼び出しを防ぐことができない場合abort
(たとえば、最善の意図にもかかわらず忍び寄るバグが原因である場合)、これにより、さらにデバッグ情報を収集できる可能性があります。これは移植可能な ANSI C であるため、Unix や Windows、その他のプラットフォームでも動作しますが、アボート ハンドラで行うことは移植性がないことがよくあります。このハンドラーは、assert
が失敗したとき、または他のランタイム関数によっても呼び出されることに注意してください。たとえば、malloc
ヒープの破損が検出された場合などです。そのため、そのハンドラーの間、プログラムはクレイジーな状態になる可能性があります。メモリを割り当てるべきではありません - 可能であれば静的バッファを使用してください。最低限必要な情報を収集し、ユーザーにエラー メッセージを表示して終了するだけです。
一部のプラットフォームでは、abort
機能をさらにカスタマイズできる場合があります。たとえば、Windows の場合、Visual C++ には_set_abort_behavior
、ユーザーにメッセージを表示するかどうか、およびクラッシュ ダンプを収集するかどうかを選択できる機能があります。
Linuxのマニュアルページによると、abort()は、シグナルハンドラーがキャッチできるプロセスへのSIGABRTを生成します。編集:ベンはこれがWindowsでも可能であることを確認しました-以下の彼のコメントを参照してください。
自分で書いてみて、リンカが std::abort の代わりに自分のものを呼び出すようにすることができます。ただし、それが可能かどうかはわかりません。