It is operating system and implementation specific. Practically also depends upon the compiler and optimization flags.
Very probably, you have hit some undefined behavior.
Probably valgrind should be a helpful tool.
If on Linux, read core(5) & proc(5) & signal(7). You might set up system-wide your /proc/sys/kernel/core_pattern
pseudo-file to start some external program or script (perhaps starting a debugger) on core dump.
You could even handle the SIGSEGV
signal in a processor- and operating-system- specific way. But I don't recommend that. See this & that
answers for more.
On Linux, syscalls (listed in syscalls(2)) are nearly the only functions you can call inside a signal handler (more precisely, it is the async-signal-safe functions mentioned in signal(7) and nothing more). But a lot of library functions (including malloc
& printf
, fprintf
, dlopen
etc...) are forbidden inside signal handlers.