当进程在后台运行时,不会生成Coredumps

时间:2017-01-30 05:17:34

标签: debugging gdb

我的程序是用C / C ++编写的,并使用-ggdb标志编译。并希望看到正在生成核心文件。

我从下面的脚本中调出程序。

#!/bin/sh
#
# Starts the application.
#
NAME=my_app
test -x /usr/bin/my_app || exit 0

start() {
        echo -n "Starting my app "
        $NAME > /dev/null 2>&1 &
        sysctl -w kernel.core_pattern='/var/core/%e.%p.%h.%t.core'
        ulimit -c unlimited
        echo "OK"
}

为了测试,我添加了以下崩溃声明。

  char z[100];
  std::strncpy(z, NULL, 100);

当我的应用程序从shell(bash)运行时,或者甚至在使用'&'在后台运行时,我可以生成核心文件。 但是当它从上面的脚本中提出时,核心文件不会生成。

我在这里做错了什么?或者还有其他方法可以解决这个问题吗? 感谢

1 个答案:

答案 0 :(得分:2)

  

但是当它从上面的脚本中提出时,核心文件就不会生成。

如果在运行脚本之前将ulimit -c设置为unlimited ,则应用程序可能会生成核心转储

你的脚本做了三件事:

  1. 在后台运行应用程序
  2. 设置核心模式
  3. 设置ulimit -c unlimited
  4. 请注意,第3步完全毫无意义:它只会影响您在设置新限制后创建的进程(在您的脚本中,这只是echo "OK")。

    您要执行的是执行步骤2,3和然后 1.按照该顺序执行时,ulimit -c unlimited实际上会影响您的应用程序(它继承了当前shell的限制)它创建的那一刻)。