Можно ли выполнить код после сбоя программы? - PullRequest
0 голосов
/ 22 февраля 2019

Я хочу иметь возможность выгружать информацию из приложения при возникновении сбоя.Можно ли сделать что-то вроде назначения обратного вызова для вызова в случае сбоя программы?Обратный вызов будет сбрасывать данные из приложения.Создаваемые данные будут относиться к конкретным приложениям, которые могут находиться в дампе стека, но в более простом для чтения непрограммисту формате.

Операционная система - Windows 10.

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Одним из возможных решений для программ Windows является использование функции MiniDumpWriteDump.На этой странице описаны различные альтернативы написания минидампа при сбое в Windows - https://docs.microsoft.com/en-us/windows/desktop/dxtecharts/crash-dump-analysis

0 голосов
/ 22 февраля 2019

Возможно ли выполнить код после сбоя программы?

Обычно, в зависимости от операционной системы, процесс получит сигнал от ОС до их завершения.Обработчик сигнала (если он был зарегистрирован и сигнал не маскируется) имеет шанс выполнить код до завершения процесса.

После завершения процесс не существует, не может выполнить код и егопамять больше недоступна.

Функции, которые можно безопасно использовать в обработчике сигналов, ограничены.Стандарт 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, который не так ограничен, как обработчик сигнала.

...