2017-01-30 31 views
0

我的程序是用C/C++编写的,并使用-ggdb标志进行编译。并希望看到正在生成的corefiles。当进程在后台运行时,不会生成Coredumps

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

#!/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); 

当我的应用程序从外壳(bash)的运行,甚至当它在后台的运行使用“&”我可能会产生corefiles。 但是,当它从上面的脚本启动时,不会生成核心文件。

我在这里做错了什么?或者有没有其他的方法来解决这个问题? 谢谢

+1

您的脚本_first_运行您的应用程序,然后设置核心文件位置 – Swift

+0

您的程序写入的语言是不相关的。内核不关心。 –

+1

更改报表的顺序。 “ulimit -c unlimited”应该是第一条语句,那么它应该开始工作 – rajesh6115

回答

2

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

应用程序可能会产生一个核心转储如果您ulimit -c设置为unlimited之前运行该脚本。

你的脚本做3两件事:

  1. 在后台运行的应用程序
  2. 一套核心图形
  3. 设置ulimit -c unlimited

注意,第3步是完全没有意义的:它只会影响您创建你设置新的限制处理(在脚本中,这仅仅是echo "OK")。

你想要做什么是执行步骤2,3和然后 1.依次进行,ulimit -c unlimited实际上会影响到你的应用程序(在它产生的力矩继承了当前shell的限制)。

+0

哦,那很简单!非常感谢 :) – SajithP