我注意到我的一些用户在崩溃后根本没有获得coredump,即使他们的配置中的其他所有内容都是正确的。
在阅读core(5)手册页后,我多次注意到这一点:
[如果不生成核心转储文件] 进程正在执行由除用户之外的用户(组)拥有的set-user-ID(set-group-ID)程序真实用户(组)进程的ID。
我的守护进程不是setuid root,但是在很多配置中它以root用户身份启动,如果.conf文件指定了用户名,它会删除权限,使用通常的组合:
setgid(gid);
setuid(uid);
当它这样做时,不再生成coredump。环境中的其他所有内容似乎都是正确的,删除这些调用(并保留为root)会像往常一样让我获得coredump。
我试图改变"真实" uid / gid就像man页面似乎建议的那样,通过调用不那么便携的setresgid / uid,似乎经常建议永久删除权限:
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
我希望能解决这个问题,但......它根本没有改进。仍然没有coredumps。
Sooo ...现在是什么?
测试代码:
#include <stdlib.h>
int main(int argc, char **argv) {
if (argc > 1) {
setgid(atoi(argv[2]));
setuid(atoi(argv[1]));
}
abort();
}
用法:
./a.out
作为任何用户在没有setgid / setuid的情况下中止./a.out 1000 100
(其中1000是uid,100是gid)以root身份删除权限并观看未发生的coredump。我已经在arch linux,centos 6.5和openbsd 5.3
中对此进行了测试答案 0 :(得分:2)
要强制进程始终进行核心转储,请使用prctl系统调用。
prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
答案 1 :(得分:1)
您必须为权限已更改的应用程序启用核心转储:
echo 2 > /proc/sys/fs/suid_dumpable
我建议你把它放在/etc/rc.local
中。
例如,这就是我所拥有的:
# This is to enable debugging as a normal user, rather than root
sysctl kernel.yama.ptrace_scope=0
# This is a convenient core file pattern
# '%e' is the name of the process
# '%p' is the pid of process
sysctl kernel.core_pattern="/tmp/core.%e.%p"
# Enable dump for processes with lowered privileges
echo 2 > /proc/sys/fs/suid_dumpable
# Remove limit for the size of core files
ulimit -c unlimited
修改强>
您可以查看这个整洁的库,它允许您手动将核心转储写入自定义文件:https://code.google.com/p/google-coredumper/
我相信这正是你所需要的。