Fichier de vidage de mémoire n'est pas généré
À chaque fois, mon plantage de l'application d'un fichier de vidage de mémoire n'est pas généré. Je me souviens il ya quelques jours, sur un autre serveur, il était généré. Je suis de l'exécution de l'application à l'aide de l'écran en bash comme ceci:
#!/bin/bash
ulimit -c unlimited
while true; do ./server; done
Comme vous pouvez le voir je suis en utilisant ulimit -c unlimited
ce qui est important si je veux générer un core dump, mais elle n'est pas toujours le générer, lorsque j'ai une erreur de segmentation.
Comment puis-je le faire fonctionner?
- il ne regarde pas le cas, mais soyez prudent si vous utilisez
sudo
(et probablement d'autres types de sous-coquille): dansulimit -c unlimited ; sudo ./server-crashing
, la nouvelle limite de ne pas avoir d'effet lorsqueserver-crashing
se bloque.
Vous devez vous connecter pour publier un commentaire.
Assurez-vous que votre répertoire actuel (au moment de la collision --
server
peut modifier les répertoires) est accessible en écriture. Si le serveur d'appelssetuid
, le répertoire doit être accessible en écriture par l'utilisateur.Également vérifier
/proc/sys/kernel/core_pattern
. Qui peut rediriger les vidages mémoire vers un autre répertoire, et que répertoire doit être accessible en écriture. Plus d'infos ici.echo "core" > /proc/sys/kernel/core_pattern
pour obtenir mon core dumps comme prévu (par défaut, il a été écrit à l'systemd-journal). Vous pouvez passer beaucoup de temps à comprendre ça...man 5 core
page de manuel. Le modèle prend en charge%p
et d'autres drapeaux.Ce lien contient une liste de vérification pourquoi core dumps ne sont pas générés:
exit()
au lieu d'utiliser le core dump gestionnaire.SIGSEGV
, puis sans plus de trucs (voir stackoverflow.com/questions/16697361) core dumps ne sera pas créé.setuid()
par exemple, à abandonner les privilèges de root, il n'est plus de base-dumpable (l'exécutable N'a PAS à être suid). Testé sur Linux 3.12 à défaut d'Arch Linux configuration. Je n'ai aucune idée de pourquoi cela se produit, il n'est pas docummented n'importe où. L'appel deprctl(PR_SET_DUMPABLE, 1, ...)
aprèssetuid
résout ce, il n'est donc pas un système de fichiers de problème d'autorisation.Vérifier:
pour voir comment vos dumps sont créés (%e sera le nom du processus, et %t sera l'heure du système).
Si vous avez Ubuntu, vos dumps sont créés par
apport
dans/var/crash
, mais dans un format différent (modifier le fichier pour le voir).Vous pouvez le tester par:
Si de base le dumping est réussie, vous verrez “(core dumped)” après la segmentation d'indication de défaut.
Lire la suite:
Comment générer des fichier de vidage de mémoire dans Ubuntu
Ubuntu
Veuillez lire plus:
https://wiki.ubuntu.com/Apport
Rappelez-vous, si vous commencez la serveur à partir d'un service, il va commencer un autre bash séance pour que l'espace ne seront pas efficaces. Essayer de mettre cela dans votre script lui-même:
Pour l'enregistrement, sur Debian 9 Stretch (
systemd
), j'ai dû installer le packagesystemd-coredump
. Par la suite, core dumps ont été générés dans le dossier/var/lib/systemd/coredump
.En outre, ces les coredumps sont compressés dans le
lz4
format. Pour décompresser, vous pouvez utiliser le packageliblz4-tool
comme ceci:lz4 -d FILE
.Pour être en mesure de déboguer le décompressé coredump à l'aide de
gdb
, moi aussi j'ai du renommer le complètement de nom de fichier long dans quelque chose de plus court...coredumpctl list
pour voir si core dumps ont été générés.Aussi, assurez-vous que vous avez suffisamment d'espace disque sur
/var/core
ou partout où votre core dumps sont écrites. Si la partition est almos plein ou à 100% de l'utilisation du disque puis que serait le problème. Mon core dumps moyenne, quelques concerts de sorte que vous devez être sûr d'avoir au moins 5 à 10 gig disponible sur la partition.Les réponses données couvrent assez bien la plupart des scénarios pour lesquels un core dump n'est pas créé. Cependant, dans mon cas, aucun de ces appliquée. Je poste cette réponse comme un complément aux autres réponses.
Si votre fichier de base n'est pas créé pour quelque raison que ce soit, je vous recommande de regarder dans /var/log/messages. Il y a peut être une astuce pour que le coeur de fichier n'est pas créé. Dans mon cas, il y avait une ligne indiquant la cause de racine:
Pour contourner ce problème, modifiez /etc/abrt/abrt-action-save-paquet de données.conf et changer ProcessUnpackaged de " non " en "oui".
Ce paramètre spécifie si de base pour les fichiers binaires n'est pas installé avec le gestionnaire de package.
Si vous appelez daemon() et puis daemonize un processus, par défaut, le répertoire de travail actuel va changer pour
/
. Donc, si votre programme est un démon, alors vous devriez être à la recherche d'un noyau dans/
répertoire et non pas dans le répertoire des binaires.Si l'on est sur une distro Linux (par exemple, CentOS, Debian), alors peut-être la manière la plus accessible pour trouver les fichiers de base et les conditions liées à l'est dans la page de man. Il suffit d'exécuter la commande suivante depuis un terminal:
Bien que cela ne va pas être un problème pour la personne qui a posé la question, parce que ils ont couru le programme qui était de produire le fichier de base dans un script avec l'aide de la commande ulimit, j'aimerais document que l'espace de commande est spécifique pour le shell dans lequel vous exécutez (variables d'environnement). J'ai passé beaucoup trop de temps à l'exécution de ulimit et sysctl et des trucs dans un shell, et la commande que je voulais dump de base dans l'autre enveloppe, et vous demandez-vous pourquoi le fichier de base n'a pas été produit.
Je vais l'ajouter à mon bashrc. Le sysctl fonctionne pour tous les processus une fois qu'il est publié, mais l'espace ne fonctionne que pour le shell dans lequel il est émis (peut-être aussi les descendants trop), mais pas pour d'autres coquilles qui se trouvent être en cours d'exécution.
Remarque: Si vous avez écrit des crash handler vous-même, alors le noyau peut pas être générées. Ainsi, la recherche de code avec quelque chose sur la ligne:
donc le SIGSEGV seront traitées par le gestionnaire et vous n'obtiendrez pas le core dump.
Juste au cas où quelqu'un tombe sur ce. J'étais en train de quelqu'un d'autre code - assurez-vous qu'ils ne sont pas de la manipulation du signal, de sorte qu'ils peuvent arrêter normalement. J'ai commenté la manipulation, et a obtenu le core dump.
Dans centos,si vous n'êtes pas root compte pour la création de fichier de base:
vous devez être réglé le compte a un privilège root ou connexion compte root:
alors si vous êtes dans le shell de connexion avec securecrt ou autres:
déconnexion et puis reconnecter