一、Linux系统产生core文件的必要条件:
Linux下不同信号有各自不同的默认处理:
Signal Value Action Comment
----------------------------------------------------------------------
SIGHUP 1 Term Hangup detected on controlling terminal
or death of controlling process
SIGINT 2 Term Interrupt from keyboard
SIGQUIT 3 Core Quit from keyboard
SIGILL 4 Core Illegal Instruction
SIGABRT 6 Core Abort signal from abort(3)
SIGFPE 8 Core Floating point exception
SIGKILL 9 Term Kill signal
SIGSEGV 11 Core Invalid memory reference
SIGPIPE 13 Term Broken pipe: write to pipe with no
readers
SIGALRM 14 Term Timer signal from alarm(2)
SIGTERM 15 Term Termination signal
SIGUSR1 30,10,16 Term User-defined signal 1
SIGUSR2 31,12,17 Term User-defined signal 2
SIGCHLD 20,17,18 Ign Child stopped or terminated
SIGCONT 19,18,25 Cont Continue if stopped
SIGSTOP 17,19,23 Stop Stop process
SIGTSTP 18,20,24 Stop Stop typed at tty
SIGTTIN 21,21,26 Stop tty input for background process
SIGTTOU 22,22,27 Stop tty output for background process
系统限制:
ulimit -c ulimited
core文件产生的路径和名称配置:
/proc/sys/kernel/core_pattern
/proc/sys/kernel/core_uses_pid
同时注意程序应对产生core的路径应有写权限,且文件系统有足够空间。
路径下不应有被占用的同名文件,或不可写的同名目录。
其他少见情况的限制:
进程拥有者应可读程序文件;
SUID(SGID)后的进程所有者应拥有相应权限。
kernel Oops
oom killer
二、实际遭遇的现象:
日志中记录程序应收到SIGABRT信号退出,但未产生core文件。
表面上未发现限制core文件产生的配置和设置。
三、原因与解决:
最后怀疑程序运行过程中工作路径改变,且该路径不可写,导致core文件无法生成。
在core dump前将工作路径chdir()回正常路径后,问题解决。