Linux: обработка ошибки сегментации и получение дампа ядра

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

ulimit -c unlimited

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

Как я могу иметь как дамп ядра системы, так и строку журнала из мой собственный обработчик сигналов одновременно?

2 ответов


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

вот пример программы с использованием 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 и просто вернуться из обработчика. Та же инструкция возникает снова, вызывая ошибку сегментации и вызывая обработчик по умолчанию.