我的程序是用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)运行时,或者甚至在使用'&'在后台运行时,我可以生成核心文件。 但是当它从上面的脚本中提出时,核心文件不会生成。
我在这里做错了什么?或者还有其他方法可以解决这个问题吗? 感谢
答案 0 :(得分:2)
但是当它从上面的脚本中提出时,核心文件就不会生成。
如果在运行脚本之前将ulimit -c
设置为unlimited
,则应用程序可能会生成核心转储。
你的脚本做了三件事:
ulimit -c unlimited
。请注意,第3步完全毫无意义:它只会影响您在设置新限制后创建的进程(在您的脚本中,这只是echo "OK"
)。
您要执行的是执行步骤2,3和然后 1.按照该顺序执行时,ulimit -c unlimited
实际上会影响您的应用程序(它继承了当前shell的限制)它创建的那一刻)。