> Linux Reviews > man >

core


  1. core.5.man


1. core.5.man

Manpage of CORE

CORE

Section: Руководство программиста Linux (5)
Updated: 2010-02-27
Index Return to Main Contents
 

ИМЯ

core - файла дампа памяти процесса  

ОПИСАНИЕ

Для определённых сигналов действием по умолчанию является завершение процесса и создание дампа памяти процесса --- дискового файла, содержащего образ памяти процесса на момент завершения. Этот образ может быть использован в отладчике (например, gdb(1)) для исследования состояния программы на момент её завершения. Список сигналов, которые приводят к созданию дампа памяти процесса, можно найти в signal(7).

Процесс может установить свой программный предел ресурса RLIMIT_CORE в максимальное значение по размеру файла дампа, который будет создан, если процесс получит сигнал "дампа памяти"; подробней смотрите в getrlimit(2).

Есть несколько обстоятельств, при которых файл дампа памяти не создаётся:

*
У процесса нет прав на запись файла дампа. (По умолчанию файл дампа называется core и создаётся в текущем рабочем каталоге. Подробней об именовании смотрите далее.) Запись файла дампа завершится неудачно, если каталог, в котором он создаётся, недоступен для записи, или если файл с таким же именем уже существует и недоступен для записи или это необычный файл (например, это каталог или символьная ссылка).
*
Существует файл (обычный, доступный на запись) с именем, которое будет использовано для дампа памяти, но есть более одной жёсткой ссылки на этот файл.
*
Файловая система, где должен быть создан файл дампа, переполнена, закончились иноды, она смонтирована только для чтения, достигнут предел пользовательской квоты.
*
Каталог, в котором должен быть создан файл дампа, не существует.
*
Пределы ресурсов RLIMIT_CORE (размер файла дампа) или RLIMIT_FSIZE (размер файла) для процесса установлены в ноль; смотрите getrlimit(2) и документацию на команду оболочки ulimit (limit в csh(1)).
*
Исполняемый процессом файл недоступен на чтение.
*
Процесс выполняет программу с установленными битом set-user-ID (set-group-ID), который принадлежит пользователю (группе) не совпадающей с ID реального пользователя (группы) процесса. (Однако посмотрите описание операции prctl(2) PR_SET_DUMPABLE, и описание файла /proc/sys/fs/suid_dumpable в proc(5).)
 

Именование файлов дампов памяти

По умолчанию, файлу с дампом памяти присваивается имя core, но с помощью файла /proc/sys/kernel/core_pattern (начиная с Linux 2.6 и 2.4.21) можно задать шаблон, который будет использован для именования файлов дампов памяти. Шаблон может содержать описатели %, которые заменяются на следующие значения при создании файла дампа:

%%
одиночный символ %
%p
PID процесса, с которого делается дамп
%u
(число) реальный UID процесса, с которого делается дамп
%g
(число) реальный GID процесса, с которого делается дамп
%s
номер сигнала, вызвавшего создание дампа
%t
время дампа, выражается в секундах с начала эпохи, 1970-01-01 00:00:00 +0000 (UTC)
%h
имя узла (как nodename, возвращаемое uname(2))
%e
имя исполняемого файла (без пути)
%c
программный предел размера файла дампа рухнувшего процесса (начиная с Linux 2.6.24)

Одиночный % в конце шаблона отбрасывается от имени файла дампа вместе с символом после %, отличным от перечисленных ранее. Все остальные символы в шаблоне вставляются в имя файла дампа как есть. Шаблон может содержать символы aq/aq, которые интерпретируются как разделители для имён каталогов. Максимальный размер получаемого имени файла дампа равен 128 байтам (64 байта для ядер до версии 2.6.19). Значение по умолчанию в этом файле равно "core". Для обратной совместимости, если /proc/sys/kernel/core_pattern не содержит "%p" и значение в /proc/sys/kernel/core_uses_pid (см. далее) не равно нулю, то к имени файла дампа будет добавлен .PID.

Начиная с версии 2.4, Linux также предоставляет более примитивный метод управления именем файла дампа памяти. Если файл /proc/sys/kernel/core_uses_pid содержит значение 0, то файл дампа памяти просто называется core. Если в этом файле содержится ненулевое значение, то к имени файла дампа добавится ID процесса (в виде core.PID).  

Передача дампов памяти в программу через канал

Начиная с версии 2.6.19, Linux поддерживает альтернативный синтаксис файла /proc/sys/kernel/core_pattern. Если первым символом в этом файле будет символ канала (|), то оставшаяся строка воспринимается как программа которую нужно запустить. Вместо записи файла на диск дамп памяти передаётся в стандартный ввод программы. Отметим следующие моменты:
*
Программа должна быть задана абсолютным именем файла (или путём относительно корневого каталога, /), и имя должна сразу следовать за символом '|'.
*
Создаваемый процесс для запуска программы будет выполняться с правами группы и пользователя root.
*
Программе можно передать аргументы командной строки (начиная с версии 2.6.24), отделяя их пробелами (максимальный размер строки 128 байт).
*
В аргументах командной строки могут быть описатели %, перечисленные ранее. Например, чтобы передать PID процесса, для которого делается дамп, укажите в аргументе %p.
 

Управление отображениями, записываемыми в дамп памяти

Начиная с версии 2.6.23, в Linux появился файл /proc/PID/coredump_filter, который определяет какие сегменты памяти записываются в файл дампа памяти при отклике на событие создания дампа памяти процесса с соответствующим ID процесса.

Значение в файле является битовой маской типов отображений памяти (см. mmap(2)). Если бит в маске установлен, то выполняется дамп отображения памяти соответствующего типа; иначе дамп не выполняется. Биты в этом файле имеют следующее значение:

бит 0
Выполнять дамп анонимных частных отображений.
бит 1
Выполнять дамп анонимных общих отображений.
бит 2
Выполнять дамп частных отображений из виртуальной памяти (file-backed).
бит 3
Выполнять дамп общих отображений из виртуальной памяти (file-backed).
бит 4 (начиная с Linux 2.6.24)
Выполнять дамп заголовков ELF.
бит 5 (начиная с Linux 2.6.28)
Выполнять дамп частных огромных страниц.
бит 6 (начиная с Linux 2.6.28)
Выполнять дамп общих огромных страниц.

По умолчанию, установлены следующие биты: 0, 1, 4 (если включён параметр настройки ядра CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS) и 5. Значения этого файла отображается в шестнадцатеричной системе счисления. (То есть значение по умолчанию выглядит как 33.)

Для страниц ввода-вывода, отображённых в память, таких как фрейм-буфер, дамп никогда не выполняется, а виртуальные страницы DSO попадают в дамп всегда, независимо от значения coredump_filter.

Дочерний процесс, созданный fork(2), наследует значение coredump_filter родителя; значение coredump_filter сохраняется и при execve(2).

Полезно указывать значение coredump_filter в родительской оболочке до запуска программы, например:

$ echo 0x7 > /proc/self/coredump_filter
$ ./какая-то_программа

Этот файл есть в системе, только если ядро было собрано с параметром настройки CONFIG_ELF_CORE.  

ЗАМЕЧАНИЯ

Команду gdb(1) gcore можно использовать для получения дампа памяти работающего процесса.

Если для многонитевого процесса (или, точнее, процесса, который делит свою памяти с другим процессом, созданным с флагом CLONE_VM через clone(2)) выполняется дамп памяти, то ID процесса всегда добавляется к имени файла дампа, если ID процесса уже не включён в это имя с помощью %p в /proc/sys/kernel/core_pattern. (Это, главным образом, полезно когда применяется реализация LinuxThreads, где каждая нить процесса имеет свой PID.)  

ПРИМЕР

Эта программа может использоваться для демонстрации синтаксиса канала в файле /proc/sys/kernel/core_pattern. Следующий сеанс оболочки демонстрирует использование данной программы (при компиляции был создан исполняемый файл с именем core_pattern_pipe_test):

$ cc -o core_pattern_pipe_test core_pattern_pipe_test.c
$ su
Password:
# echo aq|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%saq > \
/proc/sys/kernel/core_pattern
# exit
$ sleep 100
^\                     # type control-backslash
Quit (core dumped)
$ cat core.info
argc=5
argc[0]=</home/mtk/core_pattern_pipe_test>
argc[1]=<20575>
argc[2]=<UID=1000>
argc[3]=<GID=100>
argc[4]=<sig=3>
Total bytes in core dump: 282624
 

Исходный код программы

/* core_pattern_pipe_test.c */

#define _GNU_SOURCE
#include <sys/stat.h>
#include <fcntl.h>
#include <limits.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>

#define BUF_SIZE 1024

int
main(int argc, char *argv[])
{
    int tot, j;
    ssize_t nread;
    char buf[BUF_SIZE];
    FILE *fp;
    char cwd[PATH_MAX];

    /* Изменяем наш текущий рабочий каталог на тот, что у
       упавшего процесса */

    snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
    chdir(cwd);

    /* Записываем вывод в файл "core.info" в этом каталоге */

    fp = fopen("core.info", "w+");
    if (fp == NULL)
        exit(EXIT_FAILURE);

    /* Показываем аргументы командной строки, переданные программе
       core_pattern */

    fprintf(fp, "argc=%d
", argc); for (j = 0; j < argc; j++) fprintf(fp, "argc[%d]=<%s>
", j, argv[j]); /* Подсчитываем байты стандартного ввода (дампа памяти) */ tot = 0; while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0) tot += nread; fprintf(fp, "Total bytes in core dump: %d
", tot); exit(EXIT_SUCCESS); }
 

СМОТРИТЕ ТАКЖЕ

bash(1), gdb(1), getrlimit(2), mmap(2), prctl(2), sigaction(2), elf(5), proc(5), pthreads(7), signal(7)


 

Index

ИМЯ
ОПИСАНИЕ
Именование файлов дампов памяти
Передача дампов памяти в программу через канал
Управление отображениями, записываемыми в дамп памяти
ЗАМЕЧАНИЯ
ПРИМЕР
Исходный код программы
СМОТРИТЕ ТАКЖЕ

This document was created by man2html using the manual pages.
Time: 17:41:13 GMT, October 23, 2013

SVENSKA - SVENSKA - ja - pl