当应用程序/线程具有 SIGSEGV==11 时,是否可以强制 FreeBSD 生成核心文件?
我有一个正在执行此操作的应用程序,但是,我认为它只是正在死亡的线程之一,并且可执行文件保持运行。
该可执行文件作为服务运行 - 文件在哪里?我可以强制核心文件显示在 /tmp 中吗?
谢谢
您要查找的联机帮助页是 core(5)。您可能希望将 kern.corefile 设置为您确定具有写入权限并且有足够空间的位置
根据man signal
,一个 SIGSEGV 应该总是生成一个核心文件。
附带条件是将在当前工作目录中生成一个核心文件,该目录通常是进程启动时的工作目录。我很确定你不能改变这种行为。请注意,某些程序是由 shell 脚本启动的,该脚本会在启动二进制文件之前更改工作目录,因此您可以通过修改 shell 脚本来影响事情。
根据手册的调试部分,您还可以将 GDB 附加到正在运行的进程。
如果你想在一个中心位置收集核心文件/tmp
,你可以在 cron 中运行这样的东西:
find ~ -name '*.core' -exec mv {} /tmp \;
什么是
# sysctl kern.coredump
输出?如果它是0,那么你应该把它设置为1,即,
# sysctl kern.coredump=1
在 Linux 上,如果我遇到这个问题,我会检查是否设置了 ulimit -c unlimited。这可能也适用于 FreeBSD。请参阅:如何在我的 Linux C++ 程序中启用核心转储
获取要杀死的进程的 pid:
ps -ef | grep 进程名称
这会给你这样的东西:
user PID TID 0 etc
杀死 -6 PID
确保进程已死,再次运行它,它不应该像以前那样向您显示进程。
ps -ef | grep PID
是的,这是可能的。
#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)