0

ncurses を使用していますが、segfault が発生するたびに、ncurses は端末の制御を適切に解放しません (endwin() が呼び出されなかったため)。シグナルハンドラーをセットアップしました:

void handler(int signum) {
    endwin();
    exit(EXIT_FAILURE);
}

しかし、これの問題は、endwin() の後まで遅延するのではなく、segfault が無視されることです。私は C++ にはかなり慣れていません。最終的にブロックできるように、セグメンテーション違反を例外のようにキャッチできますか? または、ハンドラー内から segfault を再送信する方法はありますか?

4

2 に答える 2

4

Segfault は未定義の動作です。それを見つけて修正する必要があります。ncurses が端末を解放しないことを心配する必要はありません。バグを見つけて修正してください。

于 2010-11-13T01:01:37.380 に答える
0

シグナルの マニュアルページから:

POSIX によると、kill(2) または raise(3) によって生成されたのではない SIGFPE、SIGILL、または SIGSEGV シグナルを無視した後のプロセスの動作は未定義です。

セグメント障害の後に何かをしようとするのはクレイジーです。これは、衝突後に作動するエアバッグのようなもので、運転を続けます。なぜなら、エアバッグがあり、衝突時に安全を保つからです。これをハンドラーでペーパーするのは方法ではありません。

1 つの方法は、プログラムにファイルから入力を取得させるか、出力をスタブ化させることです。gdb を使用してリモートでプロセスにアタッチすることもできます。やったことはありませんが、試してみる価値はあります。

于 2010-11-13T01:45:24.040 に答える