Flu sh асинхронный регистратор на SIGSEGV C ++ - PullRequest
0 голосов
/ 04 мая 2020

У меня есть асинхронный регистратор, который записывает журналы в файл с рабочим потоком. Он хранит очередь сообщений и записывает их на диск по порядку.

Если моя программа вызывает ошибку сегментации, то я не могу гарантировать печать всех сообщений.

Я думаю об использовании std::signal, чтобы поймать SIGSEGV, flu sh асинхронный регистратор, а затем выйти из программы.

Разумно ли это? Или поведение полностью не определено после возникновения ошибки сегментации.

1 Ответ

0 голосов
/ 05 мая 2020

Поведение после получения SIGSEGV в целом определенно не является неопределенным, некоторые JVM генерируют исключения NullPointerExceptions из фактических разыменованных нулевых указателей.

См. http://man7.org/linux/man-pages/man7/signal-safety.7.html, чтобы узнать, что официально разрешено в обработчике сигналов .

В частых случаях доступа к NULL или неинициализированному указателю велика вероятность, что реальная проблема локализуется в потоке, запускающем SEGV, и очистка регистратора работает нормально. Конечно, как уже объяснил @ paulmckenz ie, это компромисс между дополнительной информацией, полученной при очистке регистратора, и риском полного отсутствия информации.

...