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 :
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é.
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 :
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.
A partir de Linux 3.6, si /proc/sys/fs/suid_dumpable a pour valeur 2 («suidsafe»), le motif doit être soit un chemin absolu (commençant par le caractère '/'), soit un tube, comme indiqué plus bas.
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 :
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 :
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.
La commande gdb(1) gcore peut être utilisée pour obtenir une image mémoire d'un processus en cours d'exécution.
Dans Linux jusqu’à la version 2.6.27 comprise, 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 obsolète LinuxThreads, pour laquelle chaque thread a son propre PID.)
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
/* 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);
}
bash(1), gdb(1), getrlimit(2), mmap(2), prctl(2), sigaction(2), elf(5), proc(5), pthreads(7), signal(7)
Cette page fait partie de la publication 3.65 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/.
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> ».