我们在几台 RHEL 5 机器上运行了一个内部守护进程,它会定期出现段错误。我们的开发人员需要一个核心文件来帮助调试,但我无法让它生成一个。
$ sudo grep segfault /var/log/messages.1
Aug 11 21:04:13 pal108 kernel: brokend[28692]: segfault at 00000000000000a8
rip 00000031d020f908 rsp 00007fff9c60f3f0 error 4
守护进程使用daemon
从启动/etc/init.d/functions
,因此添加
DAEMON_COREFILE_LIMIT=unlimited
其sysconfig
文件也应进行ulimit
相应设置。根据以下内容,情况似乎如此procfs
:
$ sudo grep core /proc/$(cat /var/run/brokend.pid)/limits
Max core file size unlimited unlimited bytes
核心文件模式指向存在的位置:
$ cat /proc/sys/kernel/core_pattern
"/tmp/core_%p_%e_%t"
但它仍然不会生成核心文件。有什么想法可以阻止这种情况吗?是否是段错误总是这是否意味着操作系统将尝试生成核心文件,还是依赖某些特定于应用程序的编码来执行此操作?
答案1
守护进程是否为 setuid?setuid 进程默认不会转储核心文件。
运行sysctl fs.suid_dumpable=1
以启用 setuid 转储。
答案2
是的,当向产生核心故障的进程发送信号时,总会写入核心转储:
ABRT 6 core
FPE 8 core
ILL 4 core
QUIT 3 core
SEGV 11 core
TRAP 5 core
SYS core might not be implemented
EMT core might not be implemented
BUS core core dump might fail
XCPU core core dump might fail
XFSZ core core dump might fail
应该设置 ulimit(正如您已经提到的)。由于我对 Redhat 了解不多,我会检查运行守护进程的用户下的 ulimit 是否已设置。我只需输入一个
echo -n "ulimit: "
ulimit -c
echo -n "For id: "
id -u
echo
在脚本中进行测试。
查看“man core”,其中有一个示例代码可以测试 coredump 功能。至少在 debian 下有。