分段错误后清空核心转储文件

时间:2012-11-15 18:28:15

标签: linux debugging segmentation-fault coredump sungridengine

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

您是否听说过此类案件以及如何解决?

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

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

4 个答案:

答案 0 :(得分:9)

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

comment from Ranjith Ruban帮助我开发了这种解决方法。

  

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

答案 1 :(得分:5)

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

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

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

答案 2 :(得分: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>

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

上述中的一个或组合可以帮助您解决问题。

答案 3 :(得分:0)

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

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