Question

When my application crashes with a segmentation fault I'd like to get a core dump from the system. I do that by configuring before hand

ulimit -c unlimited

I would also like to have an indication in my application logs that a segmentation fault has occured. I do that by using sigaction(). If I do that however, the signal does not reach its default handling and a core dump is not saved.

How can I have both the system core dump an a log line from my own signal handler at the same time?

Was it helpful?

Solution 2

The answer: set the sigaction with flag SA_RESETHAND and just return from the handler. The same instruction occurs again, causing a segmentation fault again and invoking the default handler.

OTHER TIPS

  1. Overwrite the default signal handler for SIGSEGV to call your custom logging function.
  2. After it is logged, restore and trigger the default handler that will create the core dump.

Here is a sample program using 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);

   // ...
}

The same idea should also work with sigaction.

Source: How to handle SIGSEGV, but also generate a core dump

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top