Возвращение к жизни после нарушения сегментации - PullRequest
14 голосов
/ 20 июля 2010

Можно ли восстановить нормальный поток выполнения программы на C после ошибки Segmentation Fault?

struct A {
    int x;
};
A* a = 0;

a->x = 123; // this is where segmentation violation occurs

// after handling the error I want to get back here:
printf("normal execution");
// the rest of my source code....

Мне нужен механизм, похожий на NullPointerException, который присутствует в Java, C # и т. Д.

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

Чего я действительно хочу добиться, так это вернуться к нормальному потоку выполнения, как в примере выше. Я знаю, что некоторые действия могут быть предприняты с использованием сигналов POSIX. Как это должно выглядеть? Другие идеи?

Ответы [ 13 ]

0 голосов
/ 20 июля 2010

Вы можете использовать функцию SetUnhandledExceptionFilter () (в windows), но даже для того, чтобы пропустить «недопустимую» инструкцию, вам нужно будет иметь возможность декодировать некоторые коды операций на ассемблере. И, как сказал glowcoder, даже если он «закомментирует» во время выполнения инструкции, которые генерируют segfaults, что останется от исходной логики программы (если ее можно так назвать)? Все возможно, но это не значит, что это нужно делать.

0 голосов
/ 20 июля 2010

Это руководство glib дает вам четкое представление о том, как писать обработчики сигналов.

A signal handler is just a function that you compile together with the rest
of the program. Instead of directly invoking the function, you use signal 
or sigaction to tell the operating system to call it when a signal arrives.
This is known as establishing the handler.

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

Обработчики сигналов в целом подразделяются на категории буксировки

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

SIGSEGV попадает под сигналы программных ошибок

0 голосов
/ 20 июля 2010

В POSIX ваш процесс будет отправлен SIGSEGV, когда вы это сделаете.Обработчик по умолчанию просто сбивает вашу программу.Вы можете добавить свой собственный обработчик с помощью вызова signal ().Вы можете самостоятельно реализовать любое поведение, обрабатывая сигнал.

...