NOM¶
core - Fichier image de la mémoire
DESCRIPTION¶
L'action par défaut de certains signaux et de faire se terminer un
processus et de produire un
fichier image mémoire
(« core dump file »). C'est un fichier disque qui contient
l'image mémoire du processus au moment où il s'est terminé.
Cette image peut être utilisé dans un débogueur (par exemple,
gdb(1)) pour étudier l'état du programme au moment où il
a été terminé. Une liste des signaux provoquant la
création de cette image mémoire se trouve dans
signal(7).
Un processus peut définir sa propre limite de ressource
RLIMIT_CORE
afin de Définir une limite supérieure à la taille du fichier
image mémoire qui sera créé s'il reçoit un signal
« core dump » ; consultez
getrlimit(2) pour
davantage d'informations.
Il y a diverses circonstances pour lesquelles un fichier image mémoire
(« core dump ») n'est pas produit :
- *
- Le processus ne possède pas les droits pour
écrire le fichier image de la mémoire. (Par défaut, le
fichier image de la mémoire s'appelle core, il est
créé dans le répertoire de travail en cours. Voir
ci-dessous pour davantage d'informations sur les règles de nommage).
L'écriture du fichier image de la mémoire échouera si le
répertoire dans lequel il devrait être écrit n'est pas
accessible en écriture ou n'est pas un fichier normal (par exemple,
si c'est un répertoire ou un lien symbolique).
- *
- Un fichier (régulier et dans lequel on peut
écrire) avec le même nom que celui qui serait utilisé pour
l'image de la mémoire existe déjà, mais il y a plusieurs
liens physiques vers ce fichier.
- *
- Le système de fichiers dans lequel serait écrit
le fichier image de la mémoire est plein ou il n'a plus d'inœud,
ou il est monté en lecture seule, ou l'utilisateur a atteint son
quota pour le système de fichiers.
- *
- Le répertoire dans lequel le fichier image de la
mémoire doit être créé n'existe pas.
- *
- Les limites de ressources RLIMIT_CORE (taille des
fichiers « core ») ou RLIMIT_FSIZE (taille des
fichiers) pour un processus ont une valeur nulle ; consultez
getrlimit(2) et la documentation de la commande ulimit de
l'interpréteur de commande ( limit dans csh(1)).
- *
- Le binaire en cours d'exécution par le processus n'a
pas les droits en écriture activés.
- *
- Le processus exécute un programme set-user-ID
(respectivement, set-group-ID) qui est détenu par un utilisateur
(respectivement, un groupe) autre que l'identifiant d'utilisateur
(respectivement, de groupe) réel du processus. (Consultez cependant
la description de l'opération prctl(2) PR_SET_DUMPABLE,
et la description du fichier /proc/sys/fs/suid_dumpable dans
proc(5)).
De plus, le fichier image peut exclure des portions de l'espace d'adressage du
processus si l'attribut
madvise(2) MADV_DONTDUMP est
utilisé.
Nommage des fichiers image mémoire¶
Par défaut, un fichier image de la mémoire s'appelle
core, mais
le fichier
/proc/sys/kernel/core_pattern (depuis Linux 2.6 et 2.4.21)
peut être configuré de manière à définir un motif qui
sera utilisé pour le nommage des fichiers image de la mémoire. Le
motif peut contenir des spécificateurs % qui sont substitués par les
valeurs suivantes lorsqu'une image de la mémoire est
créée :
- %%
- Caractère % unique
- %p
- PID du processus « dumpé »
- %u
- UID (numérique) réel du processus
« dumpé »
- %g
- GID (numérique) réel du processus
« dumpé »
- %s
- Numéro du signal ayant provoqué le
« dump »
- %t
- Heure du « dump », exprimé en
secondes depuis l'époque, 1er janvier 1970 à 00:00:00
(UTC)
- %h
- Nom d'hôte (identique à nodename tel que
le renvoie uname(2))
- %e
- Nom du fichier exécutable (sans le chemin)
- %E
- chemin d'accès de l'exécutable, où les
barres obliques (« / ») sont remplacées par des
points d'exclamation (« ! »).
- %c
- Limite de ressource souple de la taille des fichiers core
lors du plantage d'un processus (depuis Linux 2.6.24)
Un % isolé à la fin du motif est éliminé du nom de fichier
de l'image mémoire, de même un % suivi d'un caractère autre que
ceux de la liste ci-dessus. Tous les autres caractères du motif
conservent leur valeur littérale dans le nom de fichier de l'image
mémoire. Un motif peut contenir des caractère
« / », ils sont interprétés comme des
délimiteurs pour les noms de répertoires. La taille maximum du nom
de fichier de l'image mémoire résultant est de 128 octets (64 octets
dans les noyaux antérieurs au 2.6.19). La valeur par défaut de ce
nom de fichier est « core ». Afin d'assurer une
compatibilité ascendante, si
/proc/sys/kernel/core_pattern ne
contient pas « %p » et si
/proc/sys/kernel/core_uses_pid (voir ci-dessous) est non-nul, alors
.PID est ajouté au nom de fichier de l'image mémoire.
Depuis la version 2.4, Linux procure aussi une méthode plus primitive pour
contrôler le nom du fichier image de la mémoire. Si le fichier
/proc/sys/kernel/core_uses_pid contient la valeur 0, alors le fichier
image de la mémoire est tout simplement appelé
core. Si ce
fichier contient une valeur non nulle, alors, le fichier image de la
mémoire intégrera dans son nom le numéro d'identification du
processus sous la forme
core.PID.
Tuber les vidages mémoire vers un programme¶
Depuis le noyau 2.6.19, Linux gère une syntaxe alternative pour le
fichier
/proc/sys/kernel/core_pattern. Si le premier caractère de
ce fichier est le symbole du tube (
|), le reste de la ligne est
interprété comme étant un programme à exécuter. Le
vidage mémoire est alors fourni comme entrée standard au programme
plutôt que d'être écrit dans un fichier sur le disque. Veuillez
noter les points suivants :
- *
- Le programme doit être indiqué avec un chemin
d'accès absolu (ou un chemin relatif par rapport au répertoire
racine, /) et doit immédiatement suivre le caractère
« | ».
- *
- Le processus créé pour exécuter le programme
s'exécute avec les utilisateur et groupe root.
- *
- Des paramètre en ligne de commande peuvent être
fournis au programme (depuis le noyau 2.6.24), séparés par des
espaces (jusqu'à une longueur de ligne de 128 octets).
- *
- Les paramètres de la ligne de commande peuvent inclure
tout spécificateur % indiqué plus haut. Par exemple, pour passer
le PID du processus à vider, indiquez %p dans un
paramètre.
Contrôler quelles projections seront écrites dans le
vidage mémoire¶
Depuis le noyau 2.6.23, le fichier
/proc/PID/coredump_filter
spécifique à Linux peut être utilisé pour contrôler
quels segments de mémoire seront écrits dans le fichier d'image de
mémoire dans le cas où le vidage mémoire est effectué pour
le processus avec le PID correspondant.
La valeur dans ce fichier est un masque de bits des types de projection
mémoire (consultez
mmap(2)). Si un bit est positionné dans le
masque, les projections mémoire du type correspondant sont
vidées ; autrement, elles ne le sont pas. Les bits dans ce fichier
ont les significations suivantes :
- bit 0
- Vider les projections privées anonymes.
- bit 1
- Vider les projections partagées anonymes.
- bit 2
- Vider les projections privées sauvegardées sur
fichier
- bit 3
- Vider les projections partagées sauvegardées sur
fichier
- bit 4 (depuis Linux 2.6.24)
- Vider les en-têtes ELF.
- bit 5 (depuis Linux 2.6.28)
- Vider les pages privées énormes.
- bit 6 (depuis Linux 2.6.28)
- Vider les pages partagées énormes.
Par défaut, les bits suivants sont positionnés : 0, 1, 4 (si
l'option de configuration du noyau
CONFIG_CORE_DUMP_DEFAULT_ELF_HEADERS
est activée) et 5. La valeur de ce fichier est affichée en
hexadécimal (la valeur par défaut affichée est donc 33).
Les pages d'entrées-sorties projetées en mémoire telles que les
tampons de trame ne sont jamais vidées, et les pages DSO virtuelles sont
toujours vidées, quelle que soit la valeur de
coredump_filter.
Un processus fils créé avec
fork(2) hérite de la valeur de
coredump_filter de son père ; la valeur de
coredump_filter est préservée au travers d'un
execve(2).
Il peut être utile de définir
coredump_filter dans le shell
parent avant d'exécuter le programme, par exemple :
$ echo 0x7 > /proc/self/coredump_filter
$ ./un_programme
Ce fichier n'existe que si le noyau a été compilé avec l'option
de configuration
CONFIG_ELF_CORE.
NOTES¶
La commande
gdb(1) gcore peut être utilisée pour obtenir
une image mémoire d'un processus en cours d'exécution.
Si une tâche multiprocessus (« multithreaded ») (ou,
plus précisément, un processus qui partage son espace mémoire
avec un autre processus en étant créé avec l'indicateur
CLONE_VM de
clone(2)) crée une image mémoire, alors
l'identifiant du processus (PID) est toujours ajouté au nom du fichier
image de la mémoire, à moins que l'identifiant du processus fasse
déjà partie du nom de fichier par l'intermédiaire d'une
spécification %p de
/proc/sys/kernel/core_pattern. (C'est
principalement utile lors de l'utilisation de l'implémentation
LinuxThreads, pour laquelle chaque thread a son propre PID.)
EXEMPLE¶
Le programme ci-dessous montre l'utilisation de la syntaxe tube du fichier
/proc/sys/kernel/core_pattern. La session shell suivante montre
l'utilisation de ce programme (compilé pour créé un
exécutable nommé
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
^\ # 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
Source du programme¶
/* 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];
/* Change our current working directory to that of the
crashing process */
snprintf(cwd, PATH_MAX, "/proc/%s/cwd", argv[1]);
chdir(cwd);
/* Write output to file "core.info" in that directory */
fp = fopen("core.info", "w+");
if (fp == NULL)
exit(EXIT_FAILURE);
/* Display command-line arguments given to core_pattern
pipe program */
fprintf(fp, "argc=%d\n", argc);
for (j = 0; j < argc; j++)
fprintf(fp, "argc[%d]=<%s>\n", j, argv[j]);
/* Count bytes in standard input (the core dump) */
tot = 0;
while ((nread = read(STDIN_FILENO, buf, BUF_SIZE)) > 0)
tot += nread;
fprintf(fp, "Total bytes in core dump: %d\n", tot);
exit(EXIT_SUCCESS);
}
VOIR AUSSI¶
bash(1),
gdb(1),
getrlimit(2),
mmap(2),
prctl(2),
sigaction(2),
elf(5),
proc(5),
pthreads(7),
signal(7)
COLOPHON¶
Cette page fait partie de la publication 3.44 du projet
man-pages Linux.
Une description du projet et des instructions pour signaler des anomalies
peuvent être trouvées à l'adresse
<
http://www.kernel.org/doc/man-pages/>.
TRADUCTION¶
Depuis 2010, cette traduction est maintenue à l'aide de l'outil po4a
<
http://po4a.alioth.debian.org/> par l'équipe de traduction
francophone au sein du projet perkamon
<
http://perkamon.alioth.debian.org/>.
Jean-Luc Coulon et l'équipe francophone de traduction de
Debian (2006-2009).
Veuillez signaler toute erreur de traduction en écrivant à
<debian-l10n-french@lists.debian.org> ou par un rapport de bogue sur le
paquet
manpages-fr.
Vous pouvez toujours avoir accès à la version anglaise de ce document
en utilisant la commande «
man -L C
<section> <page_de_man> ».