Solution 1 :
Il y a peut-être un meilleur moyen, mais ce genre de processus l'automatise.
Mettez ce qui suit dans ~/backtrace
:
backtrace
quit
Mettez ceci dans un script appelé seg_wrapper.sh
dans un répertoire de votre chemin :
#!/bin/bash
ulimit -c unlimited
"[email protected]"
if [[ $? -eq 139 ]]; then
gdb -q $1 core -x ~/backtrace
fi
Le ulimit
commande fait en sorte que le noyau soit vidé. "[email protected]"
sont les arguments donnés au script, donc ce serait votre programme et ses arguments. $?
détient le statut de sortie, 139 semble être le statut de sortie par défaut de ma machine pour une erreur de segmentation.
Pour gdb
, -q
signifie silencieux (pas de message d'introduction) et -x
dit gdb
pour exécuter des commandes dans le fichier qui lui est donné.
Utilisation
Donc, pour l'utiliser, il vous suffirait de :
seg_wrapper.sh ./mycommand and its arguments
Mettre à jour
Vous pouvez également écrire un gestionnaire de signal qui fait cela, voir ce lien.
Solution 2 :
Désolé de venir ici 2 ans plus tard ... je suis tombé dessus en cherchant autre chose. Ajout de ceci pour être complet.
1) Bien que je pense que la réponse acceptée est excellente, elle nécessite gdb. La méthode que je connais utilise libSegFault.so.
Si vous exécutez votre application avec
LD_PRELOAD=...chemin-vers.../libSegFault.so monapp
Vous obtiendrez un rapport avec backtrace, bibliothèques chargées, etc.
2) Un script wrapper catchsegv
est également disponible qui tenterait d'utiliser addr2line
pour traduire les adresses en nom de fichier + numéro de ligne.
Ce sont des solutions beaucoup plus légères que les fichiers core ou gdb (bon pour les systèmes embarqués par exemple)
Solution 3 :
Vous avez besoin de l'ami de tout le monde GDB
gdb <program> [core file]
Une fois que vous avez chargé votre corefile, la commande 'backtrace' (peut être abrégée en bt) vous donnera la pile d'appels actuelle. Si vous exécutez votre programme depuis gdb, vous pouvez définir des points d'arrêt arbitraires et examiner le contenu de la mémoire, etc.
Solution 4 :
catchsegv
Cela a été mentionné dans une autre réponse (mais en aucun cas focalisé sur). C'est un outil pratique fourni avec le projet glibc. Il fournira une trace (et d'autres informations de débogage utiles) uniquement si un programme fait en effet erreur de segmentation.
Une bonne rédaction existe ici.
Vous pouvez l'inclure dans vos propres scripts comme bon vous semble.
Solution 5 :
Ubuntu (en tant que projet) utilise Apport pour ce faire. Vous pouvez regarder comment ils ont fait.
https://wiki.ubuntu.com/Apport