Lorsqu'un défaut de segmentation se produit sous Linux, le message d'erreur Segmentation fault (core dumped)
sera imprimé sur le terminal (le cas échéant) et le programme sera arrêté. En tant que développeur C / C ++, cela m'arrive assez souvent, et je l'ignore généralement et passe à autre chose gdb
, recréant mon action précédente afin de déclencher à nouveau la référence de mémoire non valide. Au lieu de cela, j'ai pensé que je pourrais peut-être utiliser ce "noyau" à la place, car courir gdb
tout le temps est plutôt fastidieux et je ne peux pas toujours recréer l'erreur de segmentation.
Mes questions sont trois:
- Où est ce «noyau» insaisissable jeté?
- Que contient-il?
- Que puis-je en faire?
gdb path-to-your-binary path-to-corefile
, puisinfo stack
deCtrl-d
. La seule chose inquiétante est que le core-dumping est une chose habituelle pour vous.Réponses:
Si d'autres personnes nettoient ...
... vous ne trouvez généralement rien. Mais heureusement, Linux a un gestionnaire pour cela que vous pouvez spécifier lors de l'exécution. Dans /usr/src/linux/Documentation/sysctl/kernel.txt, vous trouverez:
( merci )
Selon la source, cela est géré par le
abrt
programme (c'est l'outil de rapport automatique de bogues, pas abandonné), mais sur mon Arch Linux, il est géré par systemd. Vous voudrez peut-être écrire votre propre gestionnaire ou utiliser le répertoire courant.Mais qu'y a-t-il là-dedans?
Ce qu'il contient est spécifique au système, mais selon l'encyclopédie omnisciente :
... donc il contient essentiellement tout
gdb
que vous toujours voulu, et plus encore.Oui, mais j'aimerais que je sois heureux au lieu de gdb
Vous pouvez aussi bien être heureux car
gdb
chargera une décharge de base aussi longtemps que vous avez une copie exacte de votre exécutable:gdb path/to/binary my/core.dump
. Vous devriez alors pouvoir continuer comme d'habitude et être ennuyé en essayant et en échouant de corriger les bogues au lieu d'essayer et de ne pas reproduire les bogues.la source
Aussi, si
ulimit -c
retourne0
, aucun fichier de vidage de mémoire ne sera écrit.Voir Où rechercher le fichier principal généré par le crash d'une application Linux?
Vous pouvez également déclencher un vidage de mémoire manuellement avec CTRL- \qui quitte le processus et provoque un vidage de mémoire.
la source
Le fichier principal est normalement appelé
core
et se trouve dans le répertoire de travail actuel du processus. Cependant, il existe une longue liste de raisons pour lesquelles un fichier core ne serait pas généré, et il peut se trouver entièrement ailleurs, sous un nom différent. Voir la page de manuel core.5 pour plus de détails:la source
Dans Ubuntu, tout crash qui se produit est connecté à / var / crash. Le rapport d'erreur généré peut être décompressé à l'aide d'un outil de répartition
puis le vidage de mémoire dans le rapport décompressé peut être lu en utilisant
la source