Provided by: manpages-pl_4.13-4_all bug

NAZWA

       core - plik zrzutu pamięci

OPIS

       The  default action of certain signals is to cause a process to terminate and produce a core dump file, a
       file containing an image of the process's memory at the time of termination.  This image can be used in a
       debugger  (e.g.,  gdb(1))  to inspect the state of the program at the time that it terminated.  A list of
       the signals which cause a process to dump core can be found in 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:

       *  The process does not have permission to write the core file.  (By default, the  core  file  is  called
          core  or  core.pid, where pid is the ID of the process that dumped core, and is created in the current
          working directory.  See below for details on naming.)  Writing the core file fails if the directory in
          which  it is to be created is not writable, or if a file with the same name exists and is not writable
          or is not a regular file (e.g., it is a directory or a symbolic link).

       *  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)).

       *  The binary being executed by the process does not have read permission enabled.  (This is  a  security
          measure  to  ensure  that  an  executable  whose contents are not readable does not produce a—possibly
          readable—core dump containing an image of the executable.)

       *  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).

       *  /proc/sys/kernel/core_pattern  is  empty  and  /proc/sys/kernel/core_uses_pid  contains  the  value 0.
          (These  files  are  described  below.)   Note  that  if  /proc/sys/kernel/core_pattern  is  empty  and
          /proc/sys/kernel/core_uses_pid contains the value 1, core dump files will have names of the form .pid,
          and such files are hidden unless one uses the ls(1)  -a option.

       *  (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).

       On  systems that employ systemd(1)  as the init framework, core dumps may instead be placed in a location
       determined by systemd(1).  See below for further details.

   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  The process or thread's comm value, which typically  is  the  same  as  the  executable  filename
               (without path prefix, and truncated to a maximum of 15 characters), but may have been modified to
               be something different; see the discussion of /proc/[pid]/comm and /proc/[pid]/task/[tid]/comm in
               proc(5).
           %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.

       Paths are interpreted according to the settings that are active for the crashing process.  That means the
       crashing  process's  mount  namespace (see mount_namespaces(7)), its current working directory (found via
       getcwd(2)), and its root directory (see chroot(2)).

       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
       Since kernel 2.6.19, Linux supports an alternate syntax for the /proc/sys/kernel/core_pattern  file.   If
       the  first  character of this file is a pipe symbol (|), then the remainder of the line is interpreted as
       the command-line for a user-space program (or script) that is to be executed.

       Since kernel 5.3.0, the pipe template is split on spaces  into  an  argument  list  before  the  template
       parameters  are  expanded.   In  earlier  kernels,  the  template  parameters  are expanded first and the
       resulting string is split on spaces into an argument list.  This means that in earlier kernels executable
       names  added  by  the %e and %E template parameters could get split into multiple arguments.  So the core
       dump handler needs to put the executable names as the last argument and ensure it joins all parts of  the
       executable  name  using  spaces.   Executable  names  with  multiple  spaces  in  them  are not correctly
       represented in earlier kernels, meaning that the core dump handler needs to use mechanisms  to  find  the
       executable name.

       Instead  of  being  written to a file, the core dump is given as standard input to the program.  Note the
       following points:

       *  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 "|".

       *  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.

       *  Proces tworzony do wykonania programu jest wykonywany jako użytkownik i grupa root.

       *  Running as root does not confer any exceptional security bypasses.  Namely, LSMs (e.g.,  SELinux)  are
          still  active  and  may  prevent  the  handler  from  accessing  details about the crashed process via
          /proc/[pid].

       *  The program pathname is interpreted with respect to the  initial  mount  namespace  as  it  is  always
          executed  there.   It  is not affected by the settings (e.g., root directory, mount namespace, current
          working directory) of the crashing process.

       *  The process runs in the initial namespaces (PID, mount, user, and so on) and not in the namespaces  of
          the  crashing  process.  One can utilize specifiers such as %P to find the right /proc/[pid] directory
          and probe/enter the crashing process's namespaces if needed.

       *  The process starts with its current working directory as  the  root  directory.   If  desired,  it  is
          possible change to the working directory of the dumping process by employing the value provided by the
          %P specifier to change to the location of the dumping process via /proc/[pid]/cwd.

       *  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).

       *  The RLIMIT_CORE limit is not enforced for core dumps that are piped to a program via this mechanism.

   /proc/sys/kernel/core_pipe_limit
       When  collecting  core  dumps  via  a  pipe  to a user-space program, it can be useful for the collecting
       program to gather data about the crashing process from that process's /proc/[pid] directory.  In order to
       do  this  safely,  the  kernel  must  wait for the program collecting the core dump to exit, so as not to
       remove the crashing process's /proc/[pid] files prematurely.  This in turn creates the possibility that a
       misbehaving collecting program can block the reaping of a crashed process by simply never exiting.

       Since  Linux 2.6.32, the /proc/sys/kernel/core_pipe_limit can be used to defend against this possibility.
       The value in this file defines how many concurrent crashing processes may be piped to user-space programs
       in  parallel.  If this value is exceeded, then those crashing processes above this value are noted in the
       kernel log and their core dumps are skipped.

       A value of 0 in this file is special.  It indicates that unlimited processes may be captured in parallel,
       but  that  no  waiting  will  take  place  (i.e.,  the  collecting  program  is  not guaranteed access to
       /proc/<crashing-PID>).  The default value for this file is 0.

   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 (vdso(7)) 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.

   Core dumps and systemd
       On  systems  using  the  systemd(1)  init framework, core dumps may be placed in a location determined by
       systemd(1).  To do this, systemd(1) employs the core_pattern feature that allows piping core dumps  to  a
       program.   One  can verify this by checking whether core dumps are being piped to the systemd-coredump(8)
       program:

           $ cat /proc/sys/kernel/core_pattern
           |/usr/lib/systemd/systemd-coredump %P %u %g %s %t %c %e

       In this case, core dumps will be placed in the location configured for systemd-coredump(8), typically  as
       lz4(1)   compressed  files in the directory /var/lib/systemd/coredump/.  One can list the core dumps that
       have been recorded by systemd-coredump(8)  using coredumpctl(1):

       $ coredumpctl list | tail -5
       Wed 2017-10-11 22:25:30 CEST  2748 1000 1000 3 present  /usr/bin/sleep
       Thu 2017-10-12 06:29:10 CEST  2716 1000 1000 3 present  /usr/bin/sleep
       Thu 2017-10-12 06:30:50 CEST  2767 1000 1000 3 present  /usr/bin/sleep
       Thu 2017-10-12 06:37:40 CEST  2918 1000 1000 3 present  /usr/bin/cat
       Thu 2017-10-12 08:13:07 CEST  2955 1000 1000 3 present  /usr/bin/cat

       The information shown for each core dump includes the date and time of the dump, the PID, UID, and GID of
       the dumping process, the signal number that caused the core dump, and the pathname of the executable that
       was being run by the dumped process.  Various options to coredumpctl(1)  allow a specified coredump  file
       to  be pulled from the systemd(1)  location into a specified file.  For example, to extract the core dump
       for PID 2955 shown above to a file named core in the current directory, one could use:

           $ coredumpctl dump 2955 -o core

       For more extensive details, see the coredumpctl(1)  manual page.

       To (persistently) disable the systemd(1)  mechanism that archives core dumps, restoring to something more
       like  traditional  Linux behavior, one can set an override for the systemd(1)  mechanism, using something
       like:

           # echo "kernel.core_pattern=core.%p" > \
                          /etc/sysctl.d/50-coredump.conf
           # /lib/systemd/systemd-sysctl

       It is also possible to temporarily (i.e., until the next reboot) change the core_pattern setting using  a
       command  such  as the following (which causes the names of core dump files to include the executable name
       as well as the number of the signal which triggered the core dump):

           # sysctl -w kernel.core_pattern="%e-%s.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ŁADY

       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

   Kod źródłowy 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[])
       {
           ssize_t nread, tot;
           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 (int 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: %zd\n", tot);

           fclose(fp);
           exit(EXIT_SUCCESS);
       }

ZOBACZ TAKŻE

       bash(1),  coredumpctl(1),  gdb(1),  getrlimit(2),  mmap(2),  prctl(2),  sigaction(2),  elf(5),   proc(5),
       pthreads(7), signal(7), systemd-coredump(8)

O STRONIE

       Angielska  wersja  tej strony pochodzi z wydania 5.10 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 są: Robert Luberda <robert@debian.org> i
       Michał Kułach <michal.kulach@gmail.com>

       Niniejsze tłumaczenie jest wolną dokumentacją. Bliższe informacje  o  warunkach  licencji  można  uzyskać
       zapoznając  się  z  GNU General Public License w wersji 3 ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩ lub
       nowszej. Nie przyjmuje się ŻADNEJ ODPOWIEDZIALNOŚCI.

       Błędy w tłumaczeniu  strony  podręcznika  prosimy  zgłaszać  na  adres  listy  dyskusyjnej  ⟨manpages-pl-
       list@lists.sourceforge.net⟩.