2

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

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

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

谢谢

4

5 回答 5

2

您要查找的联机帮助页是 core(5)。您可能希望将 kern.corefile 设置为您确定具有写入权限并且有足够空间的位置

于 2012-07-06T08:39:36.370 回答
1

根据man signal,一个 SIGSEGV 应该总是生成一个核心文件。

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

根据手册的调试部分,您还可以将 GDB 附加到正在运行的进程。

如果你想在一个中心位置收集核心文件/tmp,你可以在 cron 中运行这样的东西:

find ~ -name '*.core' -exec mv {} /tmp \;
于 2012-07-03T19:30:52.463 回答
1

什么是

# sysctl kern.coredump

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

# sysctl kern.coredump=1
于 2012-08-01T13:27:05.707 回答
0

在 Linux 上,如果我遇到这个问题,我会检查是否设置了 ulimit -c unlimited。这可能也适用于 FreeBSD。请参阅:如何在我的 Linux C++ 程序中启用核心转储

获取要杀死的进程的 pid:

ps -ef | grep 进程名称

这会给你这样的东西:

user    PID  TID  0 etc

杀死 -6 PID

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

ps -ef | grep PID

于 2012-07-03T20:57:45.943 回答
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)

于 2017-03-22T06:54:27.643 回答