Ошибка сегментации в присутствии обработчика сигнала - PullRequest
3 голосов
/ 25 июля 2011

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

Что может быть причиной?Разве мой SIGSEGV обработчик не должен перехватывать все ошибки сегментации?

Ответы [ 2 ]

4 голосов
/ 25 июля 2011

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

Вы можете определить другую область памяти, которая будет использоваться в качестве стека для обработчиков сигналов sigaltstack(), а затем установите параметр SA_ONSTACK в sigaction() для сигнала.Это может быть то, что вы можете попробовать.

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

2 голосов
/ 25 июля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...