NOM
core - Fichier image de la mémoire
L’action par défaut de certains signaux et de faire se terminer un
processus et de produire un fichier image mmoire (« 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 fixer une limite supérieure à la taille du fichier image
mémoire qui sera créé s’il reçoit un signal « core dump » ; voir
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’inode, 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. (Voir 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)).
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 (le 1er
janvier 1970, 00H00 UTC)
%h Nom d’hôte (identique à nodename tel que le renvoie uname(2))
%e Nom du fichier exécutable (sans le chemin)
%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 (voir 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
La valeur par défaut de coredump_filter est 0x3 ; cela reflète le
comportement traditionnel de linux et signifie que seuls les segments
de mémoire anonyme sont vidés.
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.23 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
Cette page de manuel a été traduite et est maintenue par Jean-Luc
Coulon (f5ibh) <jean-luc.coulon AT wanadoo DOT fr> et l’équipe
francophone de traduction de Debian.
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> ».