为什么我的 Redhat 服务器上的 QuickFIX 进程没有将其核心文件写到它应该写的地方?

Why does a QuickFIX process on my Redhat server not write its core file where it should?

我在 Redhat 6.9 服务器上有 10 个 C++ 程序 运行,全部使用一些内部开发的库。其中一个库实现了日志记录,并为日志文件保持文件描述符 3 打开。如果任何进程收到分段违规信号(信号 11),就会在 /tmp 中生成一个核心文件,正如 /proc/sys/kernel/core_pattern 所预期的那样。但是,特别是 1 个进程不会这样做。如果它收到信号 11,它会将一个核心文件写入日志文件,这将变得无用,因为日志消息与二进制核心信息交织在一起。此过程的主要不同之处在于它使用 QuickFIX C++ 库版本 1.14.3。我有那个库的源代码,并且已经搜索它以查看它可能在做什么导致了这个。它覆盖的唯一信号处理程序是针对 SIGPIPE 的。它会打开一些文件,但不会对文件描述符 3 执行任何操作。QuickFIX 进程使用大约 8GB 内存,但使用更多内存的进程会正确写入其核心文件,因此我认为这不是文件大小问题。

知道 QuickFIX 库可能做了什么导致核心文件没有到达它应该去的地方,或者任何其他可能这样做的事情吗?

您确定该进程实际上是将核心转储写入日志文件,而不仅仅是崩溃前的随机数据吗?您是否尝试过禁用 coredump 生成?您是否真的在日志文件中看到特征 7ELF 序列?

如果将核心转储写入崩溃进程的打开文件描述符,这将是一个非常严重的内核错误。考虑到内核中的 coredump 实现,我真的不明白这是怎么发生的。

原来问题与QuickFIX无关。这是一个 Oracle 问题。我需要添加:

DIAG_SIGHANDLER_ENABLED=FALSE

到 $ORACLE_HOME/network/admin/sqlnet.ora 文件。我仍然不确定为什么这只发生在 QuickFIX 进程上,而不发生在任何其他 C++ Oracle 进程上,但现在这并不重要。

使用 strace 显示 SIGKILL 信号正在中断 SIGSEGV 处理程序,并且 Oracle 错误消息紧接在 strace 输出之前。它还表明 Oracle 正在为许多信号(包括 SIGSEGV)安装自己的信号处理程序。此信息将我引向另一个 StckOverflow 答案:Oracle Pro*C/OCI install handlers for SIGSEGV/SIGABRT and friends - why, and how to disable?