Lors de l'exécution d'un programme C, il dit "(core dumped)" mais je ne vois aucun fichier sous le chemin actuel.
J'ai défini et vérifié les ulimit
:
ulimit -c unlimited
ulimit -a
J'ai également essayé de trouver un fichier nommé "core", mais je n'ai pas récupéré le fichier core dumpé?
Toute aide, où est mon fichier principal?
/proc/sys/kernel/core_pattern
par une chaîne commençant par,/tmp
c'est là que vos vidages de mémoire iront.Réponses:
Lisez /usr/src/linux/Documentation/sysctl/kernel.txt .
Au lieu d'écrire le vidage de mémoire sur le disque, votre système est configuré pour l'envoyer au
abrt
programme à la place. L'outil de rapport de bogue automatisé n'est peut-être pas aussi documenté qu'il devrait l' être ...Dans tous les cas, la réponse rapide est que vous devriez pouvoir trouver votre fichier principal dans
/var/cache/abrt
, où leabrt
stocke après avoir été appelé. De même, d'autres systèmes utilisant Apport peuvent écarter les cœurs/var/crash
, etc.la source
/var/spool/abrt/
lieu de/var/cache/abrt
/var/lib/systemd/coredump/
Sur Ubuntu récent (12.04 dans mon cas), il est possible d'imprimer "Erreur de segmentation (core dumped)", mais aucun fichier core produit là où vous pourriez vous en attendre (par exemple pour un programme compilé localement).
Cela peut se produire si vous avez une taille de fichier de base ulimit de 0 (vous ne l'avez pas fait
ulimit -c unlimited
) - c'est la valeur par défaut sur Ubuntu. Normalement, cela supprimerait le "(core dumped)", vous informant de votre erreur, mais sur Ubuntu, les corefiles sont dirigés vers Apport (le système de rapport de crash d'Ubuntu) via/proc/sys/kernel/core_pattern
, et cela semble provoquer le message trompeur.Si Apport découvre que le programme en question n'en fait pas partie, il devrait signaler des plantages (que vous pouvez voir se produire dans
/var/log/apport.log
), il revient à simuler le comportement par défaut du noyau consistant à placer un fichier core dans le cwd (cela se fait dans le script/usr/share/apport/apport
). Cela inclut d'honorer ulimit, auquel cas il ne fait rien. Mais (je suppose) en ce qui concerne le noyau, un corefile a été généré (et canalisé pour répartir), d'où le message "Erreur de segmentation (core dumped)".En fin de compte, PEBKAC pour avoir oublié de définir ulimit, mais le message trompeur m'a fait penser que je devenais fou pendant un moment, me demandant ce qui mangeait mes corefiles.
(De plus, en général, la page de manuel core (5) -
man 5 core
- est une bonne référence pour savoir où se trouve votre fichier core et pourquoi il peut ne pas être écrit.)la source
sudo service apport stop
--- après avoir exécuté cela, il est passé/proc/sys/kernel/core_pattern
du tube de répartition à justecore
. Apport est assez intelligent pour réparercore_pattern
temporairement, je suppose.Avec le lancement de systemd , il existe également un autre scénario. Par défaut, systemd stockera les vidages mémoire dans son journal, accessible avec la
systemd-coredumpctl
commande. Défini dans le fichier core_pattern:Ce comportement peut être désactivé avec un simple "hack":
Comme toujours, la taille des core dumps doit être égale ou supérieure à la taille du core en cours de dumping, comme par exemple
ulimit -c unlimited
.la source
ulimit -c unlimited
.50-coredump.conf
au lieu decoredump.conf
. Cela devrait l'emporter/lib/sysctl.d/50-coredump.conf
. La valeur par défaut peut être restaurée avecsysctl -w kernel.core_pattern=core
sudo service apport stop
Écriture d'instructions pour obtenir un vidage de mémoire sous Ubuntu 16.04 LTS :
Comme @jtn l'a mentionné dans sa réponse, Ubuntu délègue l'affichage des plantages à répartir , qui à son tour refuse d'écrire le vidage car le programme n'est pas un package installé.
Pour résoudre le problème, nous devons également nous assurer que répart écrit également les fichiers de vidage de mémoire pour les programmes autres que les packages . Pour ce faire, créez un fichier nommé ~ / .config / répart / settings avec le contenu suivant:
[main] unpackaged=true
[Facultatif] Pour rendre les vidages lisibles par gdb, exécutez la commande suivante:
apport-unpack <location_of_report> <target_directory>
Références: Core_dump - Oracle VM VirtualBox
la source
Je pourrais penser à deux possibilités suivantes:
Comme d'autres l'ont déjà souligné, le programme pourrait
chdir()
. L'utilisateur exécutant le programme est-il autorisé à écrire dans le répertoire dans lequel ilchdir()
est édité? Sinon, il ne peut pas créer le vidage de mémoire.Pour une raison étrange, le vidage de mémoire n'est pas nommé.
core.*
Vous pouvez le vérifier/proc/sys/kernel/core_pattern
. De plus, la commande find que vous avez nommée ne trouverait pas de vidage de mémoire typique. Vous devez utiliserfind / -name "*core.*"
, car le nom typique du coredump estcore.$PID
la source
Si vous manquez des vidages de mémoire pour les binaires sur
RHEL
et lors de l'utilisationabrt
, assurez-vous que/etc/abrt/abrt-action-save-package-data.conf
contient
Cela permet la création de rapports d'erreur (y compris les vidages de mémoire) pour les binaires qui ne font pas partie des packages installés (par exemple, construits localement).
la source
Pour fedora25, j'ai pu trouver le fichier core sur
où
ccpp-2017-02-16-16:36:51-2974" is pattern "%s %c %p %u %g %t %P %
selon `/ proc / sys / kernel / core_pattern 'la source
Mes efforts en WSL ont été infructueux.
Pour ceux qui s'exécutent sur le sous-système Windows pour Linux (WSL), il semble y avoir un problème ouvert en ce moment pour les fichiers de vidage de mémoire manquants.
Les commentaires indiquent que
Problème avec Github
Commentaires des développeurs Windows
la source
Dans Ubuntu18.04, la façon la plus simple d'obtenir un fichier core est de saisir la commande ci-dessous pour arrêter le service d'allocation.
Réexécutez ensuite l'application, vous obtiendrez le fichier de vidage dans le répertoire actuel.
la source
Je suis sur Linux Mint 19 (basé sur Ubuntu 18). Je voulais avoir des
coredump
fichiers dans le dossier actuel. J'ai dû faire deux choses:/proc/sys/kernel/core_pattern
(par# echo "core.%p.%s.%c.%d.%P > /proc/sys/kernel/core_pattern
ou par# sysctl -w kernel.core_pattern=core.%p.%s.%c.%d.%P)
$ ulimit -c unlimited
Cela était déjà écrit dans les réponses, mais j'ai écrit pour résumer succinctement. La modification intéressante de la limite ne nécessitait pas de privilèges root (selon /ubuntu/162229/how-do-i-increase-the-open-files-limit-for-a-non-root-user non- root ne peut que baisser la limite, ce qui était inattendu - les commentaires à ce sujet sont les bienvenus).
la source
ulimit -c unlimited
fait apparaître correctement le fichier core dans le répertoire courant après un "core dumped".la source