Ответ 1
Чтобы заставить процесс всегда использовать дамп ядра, используйте системный вызов prctl.
prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
Я заметил, что некоторые из моих пользователей не получили coredump вообще после сбоя, даже если все остальное в их конфигурации показалось правильным.
После прочтения core (5) man-страницы несколько раз я заметил эту конкретную точку:
[Файл дампа ядра не создается, если] Процесс выполняет программу set-user-ID (set-group-ID), которая принадлежит пользователю (группе), отличному от реального пользователя (группы) ID процесс.
Мой демон не установлен root, но во множестве конфигураций он запускается с правами root, а если файл .conf указывает имя пользователя, он оставляет привилегии с обычной комбинацией:
setgid(gid);
setuid(uid);
Когда это произойдет, coredumps больше не создаются. Все остальное в окружающей среде кажется правильным, удаляя эти вызовы (и сохраняя их как root), как обычно, получает ядро.
Я попытался изменить "реальный" uid/gid, как подсказывал справочная страница, вызвав менее портативный setresgid/uid, который, как представляется, часто предлагает отказаться от привилегий навсегда:
setresgid(gid, gid, gid);
setresuid(uid, uid, uid);
Я ожидал, что решить проблему, но... она вообще не улучшилась. Тем не менее никаких выпуклых выпусков.
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 имеет привилегии для сброса, а часовые выходы не происходят.Я уже тестировал это в arch linux, centos 6.5 и openbsd 5.3
Чтобы заставить процесс всегда использовать дамп ядра, используйте системный вызов prctl.
prctl(PR_SET_DUMPABLE, 1, 0, 0, 0);
Вы должны включить дампы ядра для приложений, у которых есть свои привилегии:
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
Edit:
Вы можете взглянуть на эту аккуратную библиотеку, которая позволяет вручную записывать дампы ядра в пользовательский файл: https://code.google.com/p/google-coredumper/
Я считаю, что это именно то, что вам нужно.