Блок наконец для ошибок сегментации (C ++) - PullRequest
0 голосов
/ 13 ноября 2010

Я использую ncurses, и всякий раз, когда я получаю segfault, ncurses должным образом не освобождает контроль над терминалом (потому что endwin () никогда не вызывался).Я установил обработчик сигнала:

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

, но проблема в том, что segfault игнорируется, а не задерживается до endwin ().Я довольно новичок в C ++;можно ли перехватывать сегфолты как исключения, чтобы у меня был блок finally?Или есть какой-нибудь способ отправить segfault изнутри обработчика?

Ответы [ 2 ]

4 голосов
/ 13 ноября 2010

Segfault - неопределенное поведение.Вы должны найти это и исправить это.Не беспокойтесь о том, что ncurses не освободит терминал, а найдите и исправьте ошибку.

0 голосов
/ 13 ноября 2010

Из справочной страницы :

Согласно POSIX, поведение процесса не определено после того, как он игнорирует сигнал SIGFPE, SIGILL или SIGSEGV, который не был сгенерированубить (2) или поднять (3).

Попытка сделать что-либо после ошибки сегмента - это безумие.Это похоже на подушку безопасности, которую вы активируете после аварии, и вы продолжаете движение, потому что, ну, у вас есть подушка безопасности, и она будет защищать вас в аварии.Описывать это обработчиком не так.

Один из способов - заставить вашу программу принимать входные данные из файла или заглушать вывод.Вы также можете попробовать удаленно подключиться к процессу с помощью gdb .Никогда не делал этого, но, возможно, стоит попробовать.

...