段错误是否*总是*尝试转储核心?

段错误是否*总是*尝试转储核心?

我们在几台 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 下有。

相关内容