21

我正在运行一个程序,它被分段错误中断。问题是创建了核心转储文件,但大小为零。

您是否听说过这样的案例以及如何解决?

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

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

4

4 回答 4

17

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

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

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

于 2015-03-10T11:09:08.670 回答
7

听起来您正在使用批处理调度程序来启动可执行文件。也许 Torque/PBS 用来生成你的工作的 shell 继承了不同的 ulimit 值?也许调度程序的默认配置不是保留核心转储?

你可以直接从命令行运行你的程序吗?

或者,如果您在调用可执行文件之前将ulimit -c unlimited和/或添加ulimit -s unlimited到 PBS 批处理脚本的顶部,则可能能够覆盖 PBS 的默认 ulimit 行为。或者添加“ulimit -c”可以报告限制是多少。

于 2012-11-16T05:32:33.237 回答
2

如果您在已安装的驱动器中运行核心文件。核心文件不能写入已安装的驱动器,但必须写入本地驱动器。

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

于 2017-05-02T06:45:22.590 回答
0

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

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

请参阅 qconf 手册页的资源限制部分:

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>

然后使用将当前环境导出到作业qsub的选项启动。-V

以上一项或多项组合可能会帮助您解决问题。

于 2015-05-11T13:16:28.950 回答