Provided by: manpages-pl_0.7-1_all 

NAZWA
core - plik zrzutu pamięci
OPIS
Dla pewnych sygnałów domyślną akcją procesu jest zakończenie działania i utworzenie pliku zrzutu pamięci
(core), czyli pliku zawierającego obraz pamięci procesu w czasie, gdy został on zakończony. Dowolny
debugger (np. gdb(1)) może użyć tego obrazu do zbadania stanu programu w czasie jego zakończenia. Listę
sygnałów powodujących utworzenie pliku core przez proces można znaleźć w signal(7).
Proces może ustawić miękki limit zasobów RLIMIT_CORE, aby ograniczyć maksymalny rozmiar pliku, który
zostanie utworzony po otrzymaniu sygnału powodującego zrzut pamięci; szczegółowe informacje można znaleźć
w getrlimit(2).
W następujących wypadkach plik zrzutu pamięci nie będzie utworzony:
* Proces nie ma uprawnień, aby zapisać plik zrzutu pamięci (Domyślnie plik ten nazywa się core lub
core.pid, gdzie pid jest identyfikatorem procesu który zrzuca pamięć i jest tworzony w bieżącym
katalogu roboczym procesu. Nazwę tę można zmienić - patrz niżej). Zapisywanie pliku zrzutu nie
powiedzie się również wtedy, gdy prawa katalogu, w którym ten plik miałby być utworzony, nie pozwalają
na zapis do niego lub gdy plik o tej samej nazwie istnieje i nie jest zapisywalny lub nie jest zwykłym
plikiem (ale np. katalogiem lub dowiązaniem symbolicznym).
* Już istnieje (zapisywalny, zwykły) plik o tej samej nazwie, jaka zostałaby użyta dla pliku zrzutu
pamięci, jednakże plik ten ma więcej niż jedno dowiązanie twarde.
* System plików, w którym zostałby utworzony plik zrzutu pamięci, jest pełny, wyczerpał mu się limit
i-węzłów, jest zamontowany w trybie tylko do odczytu albo użytkownik osiągnął kwotę systemu plików
* Nie istnieje katalog, w którym miałby być utworzony plik zrzutu pamięci.
* Limity zasobów RLIMIT_CORE (rozmiar pliku zrzutu pamięci) lub RLIMIT_FSIZE (rozmiar pliku) dla procesu
są ustawione na zero; patrz getrlimit(2) i dokumentacja wbudowanego w powłokę polecenia ulimit (lub
limit w powłoce csh(1)).
* Nie są ustawione uprawnienia do odczytu pliku binarnego uruchomionego przez proces.
* Proces uruchomił program z flagą set-user-ID (set-group-ID), którego właścicielem jest użytkownik
(grupa) inny niż rzeczywisty użytkownik (grupa) procesu lub proces wykonujący program ma przywileje
plikowe (zob. capabilities(7)). (Jednakże patrz w prctl(2) opis operacji PR_SET_DUMPABLE oraz w
proc(5) opis pliku /proc/sys/fs/suid_dumpable).
* (od Linuksa 3.7) Jądro zostało zbudowane bez opcji CONFIG_COREDUMP.
Dodatkowo zrzut pamięci może nie zawierać części przestrzeni adresowej procesu jeśli użyto flagi
MADV_DONTDUMP madvise(2).
Nazwy plików zrzutu pamięci
Domyślnie plik zrzutu pamięci nazywa się core, jednakże w pliku /proc/sys/kernel/core_pattern (od wersji
2.6 i 2.4.21 Linuksa) można zdefiniować szablon, który będzie użyty do nazywania plików zrzutu pamięci.
Szablon ten może zawierać specjalne znaczniki zaczynające się od "%", które podczas tworzenia pliku
zrzutu będą zastąpione następującymi wartościami:
%% pojedynczy znak %
%c miękki limit zasobu rozmiaru pliku zrzutu pamięci procesu zrzucającego pamięć (od Linuksa 2.6.24)
%d tryb zrzutu—taki sam jak wartość zwracana przez prctl(2) PR_GET_DUMPABLE (od Linuksa 3.7)
%e nazwa pliku wykonywalnego (niepoprzedzona pełną ścieżką do tego pliku)
%E nazwa ścieżki pliku wykonywalnego, z ukośnikami ("/") zastąpionymi przez wykrzykniki ("!") (od
Linuksa 3.0).
%g (numeryczny) identyfikator grupy (GID) procesu, który zrzucił pamięć
%h nazwa komputera (taka sama jak nodename zwracane przez uname(2))
%i identyfikator wątku (TID) który zainicjował zrzut pamięci, taki jak w przestrzeni nazw PID-ów w
której wątek działa (od Linuksa 3.18)
%I identyfikator wątku (TID) który zainicjował zrzut pamięci, taki jak w początkowej przestrzeni
nazw PID-ów (od Linuksa 3.18)
%p identyfikator zrzucanego procesu, taki jak w przestrzeni nazw PID-ów w której proces działa
%P identyfikator zrzucanego procesu, taki jak w początkowej przestrzeni nazw PID-ów (od Linuksa
3.12)
%s numer sygnału powodującego zrzut pamięci
%t czas zrzutu wyrażony w sekundach od początku epoki, czyli od 1970-01-01 00:00:00 +0000 (UTC)
%u (numeryczny) identyfikator użytkownika (UID) procesu, który zrzucił pamięć
Jeśli szablon kończy się pojedynczym znakiem %, to znak ten zostanie usunięty z nazwy pliku zrzutu.
Podobnie zostaną usunięte wszelkie kombinacje % ze znakami innymi niż te, wymienione powyżej. Wszystkie
inne znaki szablonu staną się częścią nazwy pliku zrzutu. Szablon może zawierać znaki "/", które są
interpretowane jako separatory nazw katalogów. Maksymalna długość wygenerowanej nazwy pliku wynosi 128
bajtów (64 bajty w wersjach jądra wcześniejszych niż 2.6.19). Domyślną wartością jest "core". W celu
zachowania wstecznej zgodności, jeśli /proc/sys/kernel/core_pattern nie zawiera %p, a
/proc/sys/kernel/core_uses_pid (patrz niżej) ma niezerową wartość, to .PID będzie dołączony do nazwy
pliku zrzutu.
Od wersji 2.4 Linux dostarcza również bardziej prymitywnej metody kontrolowania nazwy pliku zrzutu
pamięci. Gdy plik /proc/sys/kernel/core_uses_pid zawiera wartość 0, plik zrzutu pamięci ma po prostu
nazwę core. Gdy plik ten zawiera wartość niezerową, plik zrzutu pamięci będzie zawierał w swojej nazwie
ID procesu, w postaci core.PID.
Od Linuksa 3.6 jeśli /proc/sys/fs/suid_dumpable ustawiono na 2 ("suidsafe") to wzorzec musi być albo
ścieżką absolutną (zaczynającą się znakiem "/") lub potokiem, zgodnie z poniższą definicją.
Przekazywanie zrzutów pamięci potokiem do programu
Od wersji 2.6.19 jądra Linux wspiera alternatywną składnię pliku /proc/sys/kernel/core_pattern. Jeśli
pierwszym znakiem pliki jest symbol potoku (|), to wszystko, co po nim występuje, jest interpretowane
jako program do uruchomienia. Zamiast zostać zapisanym na dysku, zrzut pamięci jest przekazywany na
standardowe wejście programu. Proszę zauważyć, że:
* Program musi być podany używając ścieżki bezwzględnej (lub ścieżki względnej w stosunku do korzenia
systemu plików, czyli katalogu /) i musi występować bezpośrednio po znaku "|".
* Proces tworzony do wykonania programu jest wykonywany jako użytkownik i grupa root.
* Można przekazać do programu argumenty linii poleceń (od Linuksa 2.6.24), rozdzielając je spacjami (aż
do wyczerpania limitu całkowitej długości linii wynoszącego 128 bajtów).
* Argumenty linii poleceń mogą zawierać dowolne z wymienionych powyżej specyfikatorów %. Na przykład,
aby przekazać identyfikator procesu zrzucającego pamięć, należy podać %p jako argument.
Kontrolowanie mapowań zapisywanych do pliku zrzutu pamięci
Od wersji 2.6.23 jądra można użyć specyficznego dla Linuksa pliku /proc/PID/coredump_filter do
kontrolowania, które segmenty pamięci zostaną zapisane do pliku zrzutu pamięci, w przypadku gdy pamięć
jest zrzucana przez proces o podanym identyfikatorze.
Wartość w tym pliku jest maską bitową typów mapowań pamięci (patrz mmap(2)). Jeśli bit jest ustawiony w
masce, to odpowiadające mu mapowanie jest zapisywane w pliku, w przeciwnym wypadku - nie jest. Bity w
masce mają następujące znaczenia:
bit 0 Zrzucanie anonimowych mapowań prywatnych.
bit 1 Zrzucanie anonimowych mapowań współdzielonych.
bit 2 Zrzucanie prywatnych mapowań plików.
bit 3 Zrzucanie współdzielonych mapowań plików.
bit 4 (od Linuksa 2.6.24)
Zrzucanie nagłówków ELF.
bit 5 (od Linuksa 2.6.28)
Zrzucanie prywatnych dużych stron.
bit 6 (od Linuksa 2.6.28)
Zrzucanie współdzielonych dużych stron.
bit 7 (od Linuksa 4.4)
Zrzucanie prywatnych stron DAX.
bit 8 (od Linuksa 4.4)
Zrzucanie współdzielonych stron DAX.
Domyślnie ustawione są następujące bity: 0, 1, 4 (jeśli jest włączona opcja
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS konfiguracji jądra) oraz 5. Tę wartość domyślną można zmodyfikować
przy rozruchu za pomocą opcji coredump_filter.
Wartość tego pliku jest wyświetlana szesnastkowo (z tego powodu domyślna wartość jest wyświetlana jako
33).
Strony wejścia/wyjścia mapowane w pamięci, takie jak frame buffer, nigdy nie są zrzucane, a wirtualne
strony DSO są zawsze zrzucane, niezależnie od wartości coredump_filter.
Proces-dziecko utworzony przez fork(2) dziedziczy wartość coredump_filter od swojego rodzica; wartość ta
jest także zachowywana podczas execve(2).
Może być użyteczne ustawienie coredump_filter w powłoce przed uruchomieniem programu, na przykład:
$ echo 0x7 > /proc/self/coredump_filter
$ ./some_program
Plik istnieje, jeśli jądro zostało zbudowane z włączoną opcją konfiguracji CONFIG_ELF_CORE.
UWAGI
Aby uzyskać zrzut pamięci działającego procesu, można użyć polecenia gcore programu gdb(1).
W wersjach jądra Linux do 2.6.27 włącznie, jeżeli pamięć zrzuca proces wielowątkowy (albo - bardziej
precyzyjnie - proces, który dzieli swą pamięć z innym procesem utworzonym z flagą CLONE_VM funkcji
clone(2)), to identyfikator procesu zawsze będzie dołączony do nazwy pliku zrzutu, chyba że ów
identyfikator procesu już występuje w nazwie pliku, ponieważ w pliku /proc/sys/kernel/core_pattern użyto
specyfikatora p (Jest to szczególnie użyteczne podczas stosowania przestarzałej implementacji
LinuxThreads, w której każdy wątek procesu ma inny PID).
PRZYKŁAD
Poniższy program pokazuje użycie składni potoku w pliku /proc/sys/kernel/core_pattern. Poniższa sesja
powłoki demonstruje użycie tego programu (skompilowanego do pliku o nazwie core_pattern_pipe_test):
$ cc -o core_pattern_pipe_test core_pattern_pipe_test.c
$ su
Password:
# echo "|$PWD/core_pattern_pipe_test %p UID=%u GID=%g sig=%s" > \
/proc/sys/kernel/core_pattern
# exit
$ sleep 100
^\ # wpisz control+odwrotny ukośnik
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>
Całkowita liczba bajtów pliku core: 282624
Żródło programu
/* 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];
/* Zmienia bieżący katalog roboczy na katalog procesu,
który generuje zrzut pamięci */
snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
chdir(cwd);
/* Zapisuje wyjście do pliku "core.info" w tym katalogu */
fp = fopen("core.info", "w+");
if (fp == NULL)
exit(EXIT_FAILURE);
/* Wyświetla argumenty linii poleceń przekazane do programu
filtrującego "core_pattern" */
fprintf(fp, "argc=%d\n", argc);
for (j = 0; j < argc; j++)
fprintf(fp, "argc[%d]=<%s>\n", j, argv[j]);
/* Zlicza bajty na standardowym wejściu (daje rozmiar
zrzutu pamięci) */
tot = 0;
while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0)
tot += nread;
fprintf(fp, "Całkowita liczba bajtów pliku core: %d\n", tot);
fclose(fp);
exit(EXIT_SUCCESS);
}
ZOBACZ TAKŻE
bash(1), gdb(1), getrlimit(2), mmap(2), prctl(2), sigaction(2), elf(5), proc(5), pthreads(7), signal(7)
O STRONIE
Angielska wersja tej strony pochodzi z wydania 4.05 projektu Linux man-pages. Opis projektu, informacje
dotyczące zgłaszania błędów, oraz najnowszą wersję oryginału można znaleźć pod adresem
https://www.kernel.org/doc/man-pages/.
TŁUMACZENIE
Autorami polskiego tłumaczenia niniejszej strony podręcznika man są: Robert Luberda <robert@debian.org> i
Michał Kułach <michal.kulach@gmail.com>.
Polskie tłumaczenie jest częścią projektu manpages-pl; uwagi, pomoc, zgłaszanie błędów na stronie
http://sourceforge.net/projects/manpages-pl/. Jest zgodne z wersją 4.05 oryginału.
Linux 2015-12-05 CORE(5)