强制FreeBSD app生成核心文件

时间:2012-07-03 19:19:13

标签: c unix freebsd

当应用程序/线程的SIGSEGV == 11时,是否可以强制FreeBSD生成核心文件?

我有一个正在执行此操作的应用程序,但是,我认为它只是其中一个线程正在死亡,并且可执行文件仍在运行。

此可执行文件作为服务运行 - 文件在哪里?我可以强制核心文件显示在/ tmp中吗?

由于

5 个答案:

答案 0 :(得分:2)

您正在寻找的联机帮助页是核心(5)。您可能希望将kern.corefile设置为您确定具有写访问权并且有足够空间的位置

答案 1 :(得分:1)

根据man signal,SIGSEGV应始终生成核心文件。

附带条件是将在当前工作目录中生成核心文件,这通常是进程启动时的工作目录。而且我很确定你无法改变这种行为。请注意,某些程序是由shell脚本启动的,该脚本在启动二进制文件之前更改工作目录,因此您可以通过修改shell脚本来影响事物。

根据debugging section of the handbook,您也可以将GDB附加到正在运行的进程。

如果您想在/tmp等中心位置收集核心文件,可以在cron中运行类似的内容:

find ~ -name '*.core' -exec mv {} /tmp \;

答案 2 :(得分:1)

什么是

# sysctl kern.coredump

输出?如果它是0,那么你应该把它设置为1,即

# sysctl kern.coredump=1

答案 3 :(得分:0)

在Linux上,如果我遇到这个问题,我会检查是否设置了ulimit -c unlimited。这可能也适用于FreeBSD。请参阅:How to enable core dump in my Linux C++ program

获取您要杀死的进程的pid:

ps -ef | grep process_name

这会给你这样的东西:

user    PID  TID  0 etc

kill -6 PID

确保该过程已经死亡,再次运行,它不应该像以前那样向您显示过程。

ps -ef | grep PID

答案 4 :(得分:0)

是的,这是可能的。

#include <sys/resource.h>

// core dumps may be disallowed by parent of this process; change that
struct rlimit core_limits;
core_limits.rlim_cur = core_limits.rlim_max = RLIM_INFINITY;
setrlimit(RLIMIT_CORE, &core_limits);

您也更喜欢设置系统coredump文件夹

# FreeBSD
mkdir -p /var/coredumps
chmod 777 /var/coredumps                        # for "kern.sugid_coredump=1"
sysctl kern.corefile=/var/coredumps/%U/%N.core
sysctl kern.coredump=1                          # default

有关详细信息,请参阅core(5)setrlimit(2)