Возможно ли выполнить код после сбоя программы?
Обычно, в зависимости от операционной системы, процесс получит сигнал от ОС до их завершения.Обработчик сигнала (если он был зарегистрирован и сигнал не маскируется) имеет шанс выполнить код до завершения процесса.
После завершения процесс не существует, не может выполнить код и егопамять больше недоступна.
Функции, которые можно безопасно использовать в обработчике сигналов, ограничены.Стандарт C ++ гарантирует безопасность следующих функций (может быть не исчерпывающим, если я пропустил некоторые из них):
_Exit
abort
forward
initializer_list functions
memcpy
memmove
move
move_if_noexcept
numeric_limits members
quick_exit
signal
type traits
plain lock-free atomic operations
Обратите внимание, что ни одна из функций, гарантируемых стандартом, не может выводить.Ваша операционная система может разрешать и другие функции, и должна иметь документацию, в которой перечислены их.Стандарт POSIX гарантирует безопасность функций open
и write
, которые можно использовать для вывода.
Выше предполагается, что источник сбоя находится за пределами программы (например, пользователь запрашивает завершение из ОСили ваш процесс обращается к недействительной памяти, а ОС реагирует на это).Если источник сбоя находится внутри программы, в частности, если std::terminate
вызывается вами или стандартной библиотекой, вы можете вместо этого зарегистрировать std::terminate_handler
, который не так ограничен, как обработчик сигнала.