【问题标题】:Empty core dump file after Segmentation fault分段错误后的空核心转储文件
【发布时间】:2012-11-04 10:11:50
【问题描述】:

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

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

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

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

【问题讨论】:

  • 我假设的驱动器上有可用空间吗?
  • 零长度文件的写权限是什么?
  • 下一个问题:包含目录的权限是什么?进程是否在与目录所有者不同的有效用户 ID 下运行?
  • 您说您正在使用 Grid Engine。集群中有多个节点是否正确?多个节点共享一个文件系统很容易,但是如果它们不共享一个用户帐户系统,那么在另一个节点上运行的作业很可能无法在您自己的用户 ID 下运行该作业,因此会查看文件系统作为“其他”标识。
  • 尝试创建一个临时目录并将其权限设置为全局可写。

标签: linux debugging segmentation-fault coredump sungridengine


【解决方案1】:

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

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

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

【讨论】:

  • 我将ulimit -c unlimitedulimit -s unlimited 都放入了 PBS 批处理脚本,但核心转储仍然是空的!
  • 您用于转储内核的文件系统是什么?
【解决方案2】:

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

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

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

【讨论】:

  • 我刚刚在一个带有 vboxsf 文件系统的 Linux VirtualBox 映像上遇到了这个问题,该文件系统映射到一个 NTFS 驱动器(主机的驱动器)。
  • 以 root 用户身份修改 core_pattern 创造奇迹! NFS 驱动器路径使核心文件为零字节。 stackoverflow.com/a/12760552/999943 除了设置创建它的路径之外,还有一些漂亮的语法可以改变核心文件的命名方式。 linuxhowtos.org/Tips%20and%20Tricks/coredump.htm
  • 在 VirtualBox 下挂载的文件系统也有同样的问题。谢谢!
【解决方案3】:

您可以通过使用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>

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

以上一种或多种方法可能会帮助您解决问题。

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-02-25
      • 2017-09-16
      • 2015-06-25
      • 2021-06-03
      相关资源
      最近更新 更多