CORE
Section : Manuel du programmeur Linux (
5)
Mise à jour de la version anglaise : 15 juin 2008
Index
Menu principal
NOM
core - Fichier image de la mémoire (« core dump »)
DESCRIPTION
L'action par défaut de certains signaux est de forcer un processus
à se terminer et de produire un
fichier image mémoire
(« core dump file »),
un fichier disque contenant l'image de la mémoire du processus au moment
où il s'est terminé.
Une liste des signaux provoquant la création, par un processus,
de cette image mémoire se trouve dans la page
signal(7).
Un processus peut définir sa propre limite de ressources souple
RLIMIT_CORE
afin d'établir une limite supérieure à la taille du fichier image mémoire qu'il
produirait s'il recevait un signal « core dump » ; voir
getrlimit(2)
pour d'avantage d'informations.
Il y a diverses circonstances pour lesquelles un fichier image mémoire
n'est pas produit :
- *
-
Le processus n'a pas la permission d'écrire le fichier image mémoire.
(Par défaut, le fichier image mémoire est appelé
core
et est créé dans le répertoire de travail courant.
Voir plus loin pour davantage d'informations sur les règles de nommage du fichier.)
L'écriture du fichier image mémoire échouera si le répertoire dans lequel il doit
être créé n'est pas accessible en écriture, ou si un fichier du même nom
existe déjà et n'est pas accessible en écriture ou si ce n'est pas
un fichier ordinaire
(par exemple, c'est un répertoire ou un lien symbolique).
- *
-
Un fichier (ordinaire, accessible en écriture) avec le même nom que celui
qui serait utilisé pour le fichier image mémoire existe déjà,
mais il y a plusieurs liens physiques vers ce fichier.
- *
-
Le système de fichiers dans lequel le fichier core devrait être créé est plein,
ou bien n'a plus d'inœud, ou bien est monté en lecture seule, ou bien l'utilisateur
a atteint son quota sur le système de fichiers.
- *
-
Le répertoire dans lequel le fichier image mémoire doit être créé
n'existe pas.
- *
-
Les limites de ressources
RLIMIT_CORE
ou
RLIMIT_FSIZE
pour un processus valent zéro (voir
getrlimit(2)).
- *
-
Le binaire devant être exécuté par le processus n'a pas
la permission de lecture.
- *
-
Le processus exécute un programme Set-UID (Set-GID) qui appartient
à un utilisateur (groupe) autre que l'UID (GID) réel du processus.
(Toutefois, voir la description de l'opération
PR_SET_DUMPABLE
de
prctl(2),
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 mémoire est nommé
core,
mais le fichier
/proc/sys/kernel/core_pattern
(depuis Linux 2.6 et 2.4.21)
peut être configuré pour définir un modèle qui sera utilisé pour nommer
les fichiers image mémoire.
Le modèle peut contenir des spécificateurs % qui seront substitués par
les valeurs suivantes lors de la création d'un fichier image mémoire :
-
- %%
-
Caractère % unique
- %p
-
PID du processus « dumpé »
- %u
-
(numérique) UID réel du processus « dumpé »
- %g
-
(numérique) GID 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 modèle est rejeté du nom du fichier image mémoire comme
si c'était la combinaison d'un % suivi par n'importe quel caractère
autre que ceux listés ci-dessus.
Tous les autres caractères dans le modèle deviennent une partie littérale
du nom de fichier image mémoire.
Le modèle peut comporter des caractères « / » qui seront interprétés
comme des délimiteurs de noms de répertoires.
La taille maximum du nom de fichier image mémoire résultant est 128 octets
(64 octets dans les noyaux antérieurs au 2.6.19).
La valeur par défaut dans ce fichier est « core ».
Pour rétrocompatibilité, si
/proc/sys/kernel/core_pattern
ne contient pas « %p » et si
/proc/sys/kernel/core_uses_pid
(voir plus loin)
n'est pas nul, .PID sera ajouté au nom du fichier image mémoire.
Depuis la version 2.4, Linux fournit également
/proc/sys/kernel/core_pattern,
une méthode plus primitive pour contrôler le nom du fichier image mémoire.
Si le fichier
/proc/sys/kernel/core_uses_pid
contient la valeur 0, le fichier image mémoire est tout simplement nommé
core.
Si ce fichier contient une valeur non nulle, le fichier core dump inclura
le PID dans un nom de 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 arguments de la 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 arguments 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 argument.
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
-
Dump file-backed private mappings.
- bit 3
-
Dump file-backed shared mappings.
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 à travers 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
$ ./some_program
Ce fichier n'existe que si le noyau a été compilé avec l'option de configuration
CONFIG_ELF_CORE.
NOTES
La commande
gcore
de
gdb(1)
peut être utilisée pour obtenir un fichier image mémoire d'un processus
en cours d'exécution.
Si un processus multithreadé (ou, plus précisément, un processus qui
partage sa mémoire avec un autre processus qui a été créé avec l'attribut
CLONE_VM
de
clone(2))
créé un fichier core dump, le PID est toujours ajouté au nom du fichier
image mémoire, à moins que le PID ne soit déjà inclus quelque part dans le nom
de fichier via une spécification %p dans
/proc/sys/kernel/core_pattern.
(C'est principalement utile avec l'utilisation de l'implémentation
LinuxThreads où chaque thread d'un processus a un PID différent.)
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
Le code source du programme est le suivant :
/* 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
gdb(1),
getrlimit(2),
mmap(2),
prctl(2),
sigaction(2),
elf(5),
proc(5),
pthreads(7),
signal(7)
TRADUCTION
Ce document est une traduction réalisée par Alain Portal
<aportal AT univ-montp2 DOT fr> le 30 juillet 2006
et révisée le 4 juillet 2008.
L'équipe de traduction a fait le maximum pour réaliser une adaptation
française de qualité. La version anglaise la plus à jour de ce document est
toujours consultable via la commande : « LANG=C man 5 core ».
N'hésitez pas à signaler à l'auteur ou au traducteur, selon le cas, toute
erreur dans cette page de manuel.
Index
- NOM
-
- DESCRIPTION
-
- Nommage des fichiers image mémoire
-
- Tuber les vidages mémoire vers un programme
-
- Contrôler quelles projections seront écrites dans le vidage mémoire
-
- NOTES
-
- EXEMPLE
-
- VOIR AUSSI
-
- TRADUCTION
-
Dernière mise à jour : 4 juillet 2008