Я думаю, что подход, который вы ищете, - это обработать сигнал SIGSEGV
через sigaction
.
void handler(int, siginfo_t *info, ucontext_t *uap)
{
/* Peek at parameters here... I'm not sure exactly what you want to do. */
}
/* Set up the signal handler... */
struct sigaction sa, old_sa;
memset(&sa, 0 sizeof(sa));
sa.sa_sigaction = handler;
sa.sa_flags = SA_SIGINFO;
if (sigaction(SIGSEGV, &sa, &old_sa))
{
/* TODO: handle error */
}
Однако обратите внимание, что ловить SIGSEGV
на свой собственный процесс является своего рода странно. Вероятно, этот процесс находится в плохом состоянии, из которого невозможно восстановить. Действия, которые вы сможете сделать в ответ на это, могут быть ограничены, и, скорее всего, процесс, который убивают, - это хорошо.
Если вы хотите, чтобы он был более стабильным, существует вызов sigaltstack
, который позволяет указать альтернативный буфер стека, так что если вы полностью заблокировали свой стек, вы все равно сможете обрабатывать SIGSEGV
. Для этого вам необходимо установить SA_ONSTACK
в sa.sa_flags
выше.
Если вы хотите, чтобы ответить на SEGV
от безопасности другого процесса (тем самым изолируя себя от плохо ведет себя код segfaulting и сделать это так, чтобы вы не врезаться во время осмотра его), вы можете использовать ptrace
. Этот интерфейс сложный, имеет много непереносимых частей и в основном используется для написания отладчиков. Но вы можете делать с ним большие дела, такие как чтение и запись памяти процесса и регистров, а также изменение ее исполнения.
Хммм ... Я застрял, что запись в обычный файл или fifo отлично работает - при записи в/dev/null всегда записывается 128 байтов - независимо от правильности указателя ... – Charly 2011-02-17 12:26:25