Segmentation fault 后空的核心转储文件

21

我正在运行一个程序,但是它被 Segmentation fault 中断了。问题在于,虽然创建了核心转储文件,但大小为零。

你听说过这种情况吗?怎么解决呢?

我的磁盘上有足够的空间。我已经执行了 ulimit -c unlimited 来取消限制核心转储文件大小,无论是在运行时还是将其放置在提交的批处理文件的顶部,但仍然只有 0 字节的核心转储文件。包含这些文件的文件夹的权限为 uog+rw,创建的核心文件的权限仅为 u+rw。

该程序是用 C++ 编写的,并使用 Grid Engine 的 qsub 命令在 Linux 集群上提交的。我不知道这些信息是否与此问题相关。


你的硬盘上有足够的空间吗? - Mark Loeser
下一个问题:包含目录的权限是什么?进程是否在与目录所有者不同的有效用户ID下运行? - eh9
1
你说你正在使用Grid Engine。群集中是否有多个节点是正确的?多个节点很容易共享单个文件系统,但如果它们不共享用户帐户系统,则在另一个节点上运行的作业可能无法在您自己的用户ID下运行作业,因此将文件系统视为“其他” ID。 - eh9
尝试创建一个临时目录,并将其权限设置为全局可写。 - eh9
我已经没有想法了。此外,我建议将一些信息添加到问题中,以便我们可以清理这些评论。 - eh9
显示剩余4条评论
4个回答

17

开启 ulimit -c unlimited 设置后,生成了核心转储文件。 默认情况下,核心转储文件生成在当前目录上,该目录位于nfs上。 将 /proc/sys/kernel/core_pattern 设置为 /tmp/core 帮助我解决了空转储文件的问题。

Ranjith Ruban 的评论 帮助我开发了这个解决方法。

您用于转储核心的文件系统是什么?


3
我在一台安装了Linux的VirtualBox虚拟机上遇到了问题,这台虚拟机使用vboxsf文件系统映射到了主机机器的NTFS驱动器。 - Mike Tunnicliffe
以root用户身份修改core_pattern有神奇的效果!NFS驱动器路径使core文件大小为零字节。https://dev59.com/Zmcs5IYBdhLWcg3wjUqR#12760552 此外,除了设置创建路径外,还有一些巧妙的语法可以更改核心文件的命名方式。http://www.linuxhowtos.org/Tips%20and%20Tricks/coredump.htm - phyatt
在VirtualBox下挂载文件系统时遇到了同样的问题。谢谢! - Daniel

7
似乎您正在使用批处理调度程序来启动可执行文件。也许Torque/PBS使用的shell在派生作业时继承了不同的ulimit值?或者调度程序的默认配置不是保留核心转储文件?
您可以直接从命令行运行程序吗?
如果在调用可执行文件之前在PBS批处理脚本的顶部添加和/或,则可以覆盖PBS的默认ulimit行为。或者添加'ulimit -c'可以报告限制是什么。

我在PBS批处理脚本中加入了ulimit -c unlimitedulimit -s unlimited,但是核心转储文件仍然为空! - Ali
3
你使用的文件系统用于转储核心是什么? - Ranjith Ruban

3

如果您在挂载的驱动器上运行核心文件,则无法将核心文件写入挂载的驱动器,而必须写入本地驱动器。

您可以将文件复制到本地驱动器。


0

您可以使用qsub选项,例如-l h_vmem=6G来设置所需的物理内存等资源限制,以保留6 GB的物理内存。

对于文件块,您也可以设置适当的h_fsize值。

请参阅qconf手册中的RESOURCE LIMITS部分:

http://gridscheduler.sourceforge.net/htmlman/htmlman5/queue_conf.html

s_cpu     The per-process CPU time limit in seconds.

s_core    The per-process maximum core file size in bytes.

s_data    The per-process maximum memory limit in bytes.

s_vmem    The same as s_data (if both are set the minimum is
           used).
h_cpu     The per-job CPU time limit in seconds.

h_data    The per-job maximum memory limit in bytes.

h_vmem    The same as h_data (if both are set the minimum is
           used).

h_fsize   The total number of disk blocks that this job  can
           create.

此外,如果集群在每个节点上使用本地TMPDIR,并且该目录正在填满,您可以将TMPDIR设置为具有更大容量的备用位置,例如NFS共享:
export TEMPDIR=<some NFS mounted directory>

然后使用-V选项启动qsub,将当前环境导出到作业中。
以上的一种或多种组合可能会帮助您解决问题。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接