Man core (5) файлу дампа пам’яті процесу

core (5) файлу дампа пам'яті процесу

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

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

Є кілька обставин, при яких файл дампа пам'яті не створюється:

Іменування файлів дампов пам'яті

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

%% одиночний символ%% c програмний межа розміру файлу дампа звалився процесу (починаючи з Linux 2.6.24). режим дампа - теж, як значення, що повертається prctl (2) з PR_GET_DUMPABLE (починаючи з Linux 3.7)% e ім'я виконуваного файлу (без шляху)% E шлях до виконуваного файлу, в якому символи косою риси ( '/') замінена на знаки оклику ( '!') (починаючи з Linux 3.0). % G (число) реальний GID процесу, з якого робиться дамп% h ім'я вузла (як nodename. Повертається uname (2))% i TID нитки, через яку виник дамп, по відношенню до простору імен PID, в якому розташовується нитка (починаючи з Linux 3.18)% I TID нитки, через яку виник дамп, по відношенню до початкового простору імен PID (починаючи з Linux 3.18)% p PID процесу, з якого робиться дамп, так як він бачиться в просторі імен PID, якому розташований процес% P initial PID процесу, з якого робиться дамп, так як він бачиться в первісному просторі назв PID, якому розташований проц ЕСС (починаючи з Linux 3.12)% s номер сигналу, що викликав створення дампа% t час дампа, виражається в секундах з початку епохи, 1970-01-01 00:00:00 +0000 (UTC)% u (число) реальний UID процесу , з якого робиться дамп

Одиночний% в кінці шаблону відкидається від імені файлу дампа разом з символом після%, відмінних від перерахованих раніше. Всі інші символи в шаблоні вставляються в ім'я файлу дампа як є. Шаблон може містити символи '/', які інтерпретуються як роздільники для імен каталогів. Максимальний розмір одержуваного імені файлу дампа дорівнює 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).

Починаючи з Linux 3.6, якщо значення в / proc / sys / fs / suid_dumpable дорівнює 2 ( «suidsafe»), то шаблон повинен бути або абсолютним шляхом (починатися з символу '/'), або каналом, як описано далі.

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

Починаючи з версії 2.6.19, Linux підтримує альтернативний синтаксис файлу / proc / sys / kernel / core_pattern. Якщо першим символом в цьому файлі буде символ каналу (|), то решта рядок сприймається як програма яку потрібно запустити. Замість записи файлу на диск дамп пам'яті передається в стандартне введення програми. Відзначимо наступні моменти: * Програма повинна бути задана абсолютним ім'ям файлу (або шляхом щодо кореневого каталогу, /), і ім'я має відразу слідувати за символом '|'. * Створюваний процес для запуску програми буде виконуватися з правами групи і користувача root. * Програмі можна передати аргументи командного рядка (починаючи з Linux 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) Виконувати дамп загальних величезних сторінок. біт 7 (починаючи з Linux 4.4) Виконувати дамп приватних сторінок DAX. біт 8 (починаючи з Linux 4.4) Виконувати дамп загальних сторінок DAX.

За замовчуванням, встановлено такі біти: 0, 1, 4 (якщо включений параметр настройки ядра CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS) і 5. Дане значення може бути змінено при запуску системи через параметр завантаження coredump_filter.

Значення цього файлу відображається в шістнадцятковій системі числення (тобто значення за замовчуванням виглядає як 33).

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

Дочірній процес, створений fork (2), успадковує значення coredump_filter батька; значення coredump_filter зберігається і при execve (2).

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

Цей файл є в системі тільки, якщо ядро ​​було зібрано з параметром настройки CONFIG_ELF_CORE.

Команду gdb (1) gcore можна використовувати для отримання дампа пам'яті працюючого процесу.

У версії Linux до 26.27 включно, якщо для багатонитковою процесу (або, точніше, процесу, який ділить свою пам'яті з іншим процесом, створеним з прапором CLONE_VM через clone (2)) виконується дамп пам'яті, то ID процесу завжди додається до імені файлу дампа, якщо ID процесу вже не включений в це ім'я за допомогою% p в / proc / sys / kernel / core_pattern (це, головним чином, корисно коли застосовується застаріла реалізація LinuxThreads, де кожна нитка процесу має свій PID).

Ця програма може використовуватися для демонстрації синтаксису каналу в файлі / proc / sys / kernel / core_pattern. Наступний сеанс оболонки демонструє використання даної програми (при компіляції був створений виконуваний файл з ім'ям core_pattern_pipe_test):

Вихідний код програми