Измените каталог дампа ядра приложения с помощью программы на c

#c #linux

#c #linux

Вопрос:

У меня есть один сценарий, в котором я хочу изменить каталог для дампов ядра текущим приложением, используя программу C.

У меня есть один вариант сделать chdir() для указанного каталога. Но это изменяет домашний каталог приложения. И я ищу некоторые API, которые могут изменять каталог только для дампов ядра.

Ответ №1:

Вы можете изменить шаблон дампа ядра глобально с помощью /proc/sys/kernel/core_pattern .

Но если вы хотите изменить каталог дампа ядра только одного процесса, вы можете сделать то, что делает веб-сервер Apache — зарегистрировать обработчик сигналов, который изменяет текущий каталог прямо перед сбросом ядра:

 #include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <sys/resource.h>


#define COREDUMP_DIR "/tmp"


static void sig_coredump (int sig)
{
    struct sigaction sa;

    // Change to the directory we want the core to be dumped
    chdir (COREDUMP_DIR);

    // Clear the signal handler for the signal
    memset (amp;sa, 0, sizeof (sa));
    sa.sa_handler = SIG_DFL;
    sigemptyset (amp;sa.sa_mask);
    sigaction (sig, amp;sa, NULL);

    // Send the signal again
    raise (sig);
}


int main (int argc, char **argv)
{
    struct sigaction sa;

    // Set up the signal handler for all signals that
    // can cause the core dump
    memset (amp;sa, 0, sizeof (sa));
    sa.sa_handler = sig_coredump;

    sigemptyset (amp;sa.sa_mask);
    sigaction (SIGSEGV, amp;sa, NULL);
    sigaction (SIGBUS, amp;sa, NULL);
    sigaction (SIGABRT, amp;sa, NULL);
    sigaction (SIGILL, amp;sa, NULL);
    sigaction (SIGFPE, amp;sa, NULL);

    // Enable core dump
    struct rlimit core_limit;
    core_limit.rlim_cur = RLIM_INFINITY;
    core_limit.rlim_max = RLIM_INFINITY;

    if (setrlimit (RLIMIT_CORE, amp;core_limit) == -1) {
        perror ("setrlimit");
    }

    // Trigger core dump
    raise (SIGSEGV);

    return 0;
}
 

Обратите внимание, что, поскольку это зависит от настройки самого аварийного приложения и возможности запуска обработчика сигнала, оно не может быть на 100% пуленепробиваемым — сигнал может быть доставлен до настройки обработчика сигнала или сама обработка сигнала может быть повреждена.

Комментарии:

1. Это может привести к сбою в зависимости от степени повреждения, вызвавшего ошибку сегментации. Обработка сигналов может больше не работать.