...вроде. Как показано на этом крайне упрощенном примере,
очень редко (пока сообщалось только один раз) случается, что одно из моих приложений вылетает таким образом. Я хочу завершить его, как обычно, когда возникает неспецифическое исключение. Моя стратегия состоит в том, чтобы (низкоуровнево) зарегистрировать проблему, а затем завершить ее. Приложение является частью подсистемы, и я хочу (пере)запустить его, если будет обнаружена какая-либо проблема. Он построен с помощью C++-Builder 6 и работает в Windows (XP...7, а также 8). Я узнал, что abort()
, скорее всего, вызвало сообщение об ошибке. Приложение имеет графический интерфейс, поэтому отображается окно сообщения, а не просто вывод (разблокировка) на stderr
.
И пока окно сообщения не принимается пользователем, мое приложение очевидно продолжает работать, например, оно обрабатывает таймеры (краткость жизни в приведенном выше примере увеличивается) или межпроцессные сообщения, совершенно не подозревая об этом. о проблеме.
После прочтения некоторых ответов на Какой самый простой способ вызвать сбой программы на C++? и Разница между методами повышения (SIGABRT) и abort(), я попробовал следующее
void mySignalHandler(int sig)
{
// low-level error reporting here
exit(-1);
}
void __fastcall TForm1::FormCreate(TObject *Sender)
{
signal(SIGABRT, mySignalHandler);
// some more initialisation here
}
что позволяет моему приложению завершить работу правильно, даже если вызывается abort()
или raise(SIGABRT)
. (Я также хочу, чтобы Windows не «искала решение проблемы».)
Надежно ли это (регистрация обработчика сигнала для прерывания и вызова выхода) с вашей точки зрения? ...или хотя бы что-то, на что можно опереться?
abort
илиraise
, мне нужно с этим разобраться. - person Wolf   schedule 14.08.2014