我已经配置了一个 Amazon EC2 实例以在进程崩溃时生成核心文件,并且在大多数情况下它按预期工作。问题是它并不总是有效。我遇到问题的程序由 9 个通过 MPI 协同工作的并发进程组成。当这个程序崩溃时,我几乎总是得到一个核心转储,但在极少数情况下没有生成核心转储,即使在我的捕获 stdErr 的日志中报告了 segfault(11)。在其他情况下(非常罕见),生成的核心文件会被截断。
我没有配置我的核心模式,所以只有一个核心(名为“核心”)可以存在于我的进程启动的目录中。我的问题下方有更多详细信息。
“有时”如何不生成核心转储?是否有可能两个进程试图同时转储一个核心文件,并且都因为冲突而失败?核心转储不是跟踪错误的可靠方法吗?
.bash_profile
export LD_LIBRARY_PATH=/usr/local/lib
source ./.bashrc
ulimit -c unlimited
/etc/security/limits.conf
* soft core unlimited
root hard core unlimited
ulimit -a
core file size (blocks, -c) unlimited
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited
pending signals (-i) 29879
max locked memory (kbytes, -l) 64
max memory size (kbytes, -m) unlimited
open files (-n) 1024
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 29879
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
编辑1
我发现了一个可以可靠地省略核心文件的错误。为了在程序处于可疑状态时生成内核,我在几个地方插入了以下几行:
if (value > FLT_MAX){
int *i=NULL;
*i=1;
}
大约一半的进程到达这些行和段错误中的一条,可能在几毫秒之内,因为它们采用几乎相同的代码路径。我不只是 raise(SIGSEGV) 因为我已经看到我的程序吞下了它并在之前继续;也许是因为信号在技术上不需要退出?
编辑2
核心文件现在在其名称中包含 pid:
sudo -s
echo "1" > /proc/sys/kernel/core_uses_pid
问题仍然存在。在某些情况下,ubuntu 中是否存在阻止它一次写入多个核心文件的限制?