2014-08-30 4 views
0

Или другими словами: Как вы бросаете ошибку ядра на исключение C++?Любая идея, как заставить C++ вызывать исключение при ошибке ядра

Потому что C++ способен выбросить большую часть ошибок программирования в качестве исключения. Но почему бы и не деление на нуль? Ошибка сегментации? И другие ошибки ядра?

Я понимаю, как эти ошибки возникают в ядре и обрабатываются ядром. Я также понимаю, как создается исключение и обрабатывается на C++ с помощью компилятора. Как вы видите, что точки между ними могут быть связаны? Есть ли солидная работа в этом отношении?

Заранее благодарим за любые идеи или подсказки.

Редактировать в ответ на возможный дубликат флага: Как аналогичный вопрос How to catch segmentation уже задал вопрос о части capture части segv, recovery по-прежнему отсутствует. Более того, я ищу систематический подход к восстановлению от всех видов исключений ядра, а не только от segv.

Редактировать снова: я объяснил, почему этот вопрос отличается от другого вопроса. Тем не менее 5 человек проголосовали за закрытие.

+3

Это зависит от вашей платформы. В некоторых Unix, возврат из некоторых сигналов (включая SIGSEGV, SIGFPE и SIGILL) вызывает неопределенное поведение. – Brian

+0

Правильно, я думал о сигналах, но забыл упомянуть об этом при написании вопроса. В частности, я не понял, как преобразовать сигнал в исключение C++. Если вы можете преобразовать sigsegv, это решит половину проблемы.Тем не менее, я хотел бы иметь возможность сбросить все ошибки ядра, если ошибка вызвана вашей программой. – minghua

+1

@Brian: выброс исключения или использование longjmp не считается запрещенным возвратом из обработчика сигнала. –

ответ

2

«Ядро-ошибка» не является стандартным термином. Есть события «яровая паника». Это катастрофические сбои в самом ядре, вызванные ошибками в коде ядра. Ваше приложение не имеет к ним никакого отношения.

Если мы говорим о программах пользовательского пространства, написанных на C++, такие сигналы, как SIGSEGV (но не такие сигналы, как SIGUSR1), являются событиями, вызванными неопределенным поведением в коде на C++. Ядро может обрабатывать или не обрабатывать, в зависимости от того, какая ОС и какая у вас программа. В любом случае это не называется ошибкой ядра. Что касается C++, это конец света. Вы никогда не пытаетесь обрабатывать такие сигналы, за исключением, возможно, попыток распечатать прощальное сообщение и выйти. Восстановления нет.

В некоторых очень редких случаях, связанных с реализацией, такие сигналы, как SIGSEGV, могут иметь смысл, но систематический подход не существует и не может существовать.

Редактировать в ответ на возможный дубликат флага: Как аналогичный вопрос Как поймать сегментацию, уже заданную в отношении части захвата сегрега, восстановление все еще отсутствует. Более того, я ищу систематический подход к восстановлению от всех видов исключений ядра, а не только от segv.

восстановление не представляется возможным в общем виде, поэтому вопрос похож,

На первый взгляд это кажется возможным. Тем не менее, многие из исключений могут указывать на коррумпированную среду, в которой нет возможности восстановить, но по себе резюме нормальное исполнение.

+0

+1 Для очень проницательного объяснения. – minghua