我正在运行程序,它被Segmentation fault中断。问题是核心转储文件已创建,但大小为零。
您是否听说过此类案件以及如何解决?
我在磁盘上有足够的空间。我已经执行ulimit -c unlimited
来限制核心文件的大小 - 无论是运行它还是放在提交的批处理文件的顶部 - 但仍然有0字节的核心转储文件。包含这些文件的文件夹的权限是uog + rw,创建的核心文件的权限仅为u + rw。
该程序由C ++编写,并使用Grid Engine的qsub命令在linux集群上提交,我不知道这些信息与此问题是否相关。
答案 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)
如果您在已安装的驱动器中运行核心文件。核心文件无法写入已安装的驱动器,但必须写入本地驱动器。
您可以将文件复制到本地驱动器。