Какой компонент на самом деле сбрасывает ядро?

Я не уверен, является ли это библиотекой C или какой-то другой вещью, которая выгружает содержимое в основной файл и делает программу Exit. Я имею в виду, что glibc или libc обрабатывает SIGSEGV и создает дамп ядра в функции обработчика? Пожалуйста, объясни.


person Amit    schedule 07.12.2009    source источник


Ответы (4)


В Linux за выполнение процессов ядра и механизмы обработки сигналов отвечают.

http://lxr.linux.no/#linux+v2.6.32/fs/exec.c#L1752

void do_coredump(long signr, int exit_code, struct pt_regs *regs)
    {
    ...

http://lxr.linux.no/#linux+v2.6.32/kernel/signal.c#L1926

            if (sig_kernel_coredump(signr)) {
                    if (print_fatal_signals)
                            print_fatal_signal(regs, info->si_signo);
                    /*
                     * If it was able to dump core, this kills all
                     * other threads in the group and synchronizes with
                     * their demise.  If we lost the race with another
                     * thread getting here, it set group_exit_code
                     * first and our do_group_exit call below will use
                     * that value and ignore the one we pass it.
                     */
                    do_coredump(info->si_signo, info->si_signo, regs);
person Joe Koberg    schedule 07.12.2009

Когда нет другого обработчика, ядро ​​​​сгенерирует файл ядра, если ulimit -c для процесса больше 0.

person Gonzalo    schedule 07.12.2009
comment
Если вы упомянули ulimit -c, вы должны указать, что наиболее полезными значениями для передачи являются либо 0, либо unlimited. Я не встречал никого, кто делал вид, что может что-то сделать с усеченным дампом ядра. - person Pascal Cuoq; 07.12.2009
comment
Хе. Я установил его на что-то отличное от этих значений давным-давно, когда дисковая квота была ограничением. Во всяком случае, я только что попытался использовать усеченный файл ядра в gdb и получил приличное сообщение об ошибке: Предупреждение: /tmp/core усечен: ожидаемый размер файла ядра ›= 147456, найдено: 12288. - person Gonzalo; 07.12.2009

Ядро — это то, что создает дамп ядра, по крайней мере, в Linux.

Как указывает Гонсало, ulimit -c определяет максимальный размер дампа ядра (0 полностью отключает его, а unlimited не указывает ограничения). В зависимости от доступного места на диске вы можете установить любое значение, отличное от unlimited, чтобы предотвратить заполнение диска, хотя вам, вероятно, будет сложно использовать усеченный основной файл.

Имя основного файла можно настроить с помощью /proc/sys/kernel/core_uses_pid и /proc/sys/kernel/core_pattern.

Вы можете использовать kill -SEGV <pid> для создания ядра дампа процесса.

person retracile    schedule 07.12.2009

Я считаю, что это обрабатывается ядром. Однако в Linux я не нашел библиотеки или системного вызова для создания вручную.

person Michael Ekstrand    schedule 07.12.2009
comment
И если вы находитесь внутри gdb, вы можете выполнить 'generate-core-file' - person Gonzalo; 07.12.2009