Linux: обработка ошибки сегментации и получение дампа ядра
когда мое приложение падает с ошибкой сегментации, я хотел бы получить дамп ядра из системы. Я делаю это, настраивая перед рукой
ulimit -c unlimited
Я также хотел бы иметь указание в моих журналах приложений, что произошла ошибка сегментации. Я делаю это с помощью sigaction()
. Однако если я это сделаю, сигнал не достигнет обработки по умолчанию, и дамп ядра не будет сохранен.
Как я могу иметь как дамп ядра системы, так и строку журнала из мой собственный обработчик сигналов одновременно?
2 ответов
- переписать обработчик сигнала по умолчанию для
SIGSEGV
для вызова пользовательской функции ведения журнала. - после регистрации восстановите и запустите обработчик по умолчанию, который создаст дамп ядра.
вот пример программы с использованием signal
:
void sighandler(int signum)
{
myLoggingFunction();
// this is the trick: it will trigger the core dump
signal(signum, SIG_DFL);
kill(getpid(), signum);
}
int main()
{
signal(SIGSEGV, sighandler);
// ...
}
та же идея должна также работать с sigaction
.
источник: как обрабатывать SIGSEGV, но также генерировать дамп ядра
ответ: установите sigaction с флагом SA_RESETHAND
и просто вернуться из обработчика. Та же инструкция возникает снова, вызывая ошибку сегментации и вызывая обработчик по умолчанию.