7

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

我们尝试设置ulimit -c unlimited但没有成功,因此我们setrlimit在代码本身中加入了功能,但这种方法也没有运气。而且,除此之外,我们还添加了 MALLOC_CHECK_。

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

我可以看到以下消息/var/log/message

内核:[2302077.396021] myapp [22140]:段错误在 54552e42 ip 00000000f773f36f sp 00000000fffdc48c 错误 4 in ld-2.11.3.so [f7727000+1f000]

环境:sles11

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

4

2 回答 2

4

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

  • 确保启动可以转储核心的进程(可写目录,足够的空间;我不确定进程中的目录更改是否会干扰这里)
  • 确保在启动进程的同一个 shell 中提供“ulimit -c unlimited”
  • 如果程序是 SUID 或 SGID,出于安全原因,内核将拒绝使其转储内核,请查看此问题以获取指导
于 2013-01-20T03:24:44.697 回答
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”位,这是您的二进制文件的名称,或者您可以更改模式。

于 2013-04-25T10:12:06.060 回答