应用程序崩溃,但没有生成核心转储

时间:2013-01-16 07:28:46

标签: c linux gdb opensuse suse

我遇到一个问题,我的应用程序在几天/几周后继续转储核心,但不幸的是,没有生成核心转储。

我们尝试设置ulimit -c unlimited但没有成功,因此我们在代码本身中加入了setrlimit功能,但也没有运气。最重要的是,我们也添加了MALLOC_CHECK_。

有趣的是,当我们尝试启动手动核心转储(使用kill -ABRT <pid>)时,它确实生成了核心转储。

我可以在/var/log/message

中看到以下消息
  

kernel:[2302077.396021] myapp [22140]:segfault at 54552e42 ip 00000000f773f36f sp 00000000fffdc48c error 4 in ld-2.11.3.so [f7727000 + 1f000]

环境:sles11

有关如何使应用程序更可靠地生成核心转储的任何建议?

2 个答案:

答案 0 :(得分:3)

许多当前系统都配置为不会留下核心转储(普通用户不知道如何处理它们)。

  • 确保启动可以转储核心的进程(可写目录,足够的空间;我不确定进程中的目录更改是否会干扰此处)
  • 确保在启动流程的同一个shell中提供“ulimit -c unlimited”
  • 如果程序是SUID或SGID,内核将出于安全原因拒绝转储核心,请查看this question以获取指导

答案 1 :(得分:0)

我在SLES 11中遇到了同样的问题。除了给出的建议,特别是设置“ulimit -c unlimited”之外,还需要更多的东西:

  1. 修改/etc/security/limits.conf以添加以下行。然后再次注销然后确定。

    *               soft    core            unlimited
    
  2. 默认的内核核心模式是“/var/log/cores/%e/%p-%s-%t.core”。 (参见core(5)。)如果目录部分不存在,Linux将不会创建核心文件。因此,您需要创建“%e”位,这是二进制文件的名称,或者您可以更改模式。