focal (5) core.5.gz

Provided by: manpages-pl_0.7-2_all bug

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.