Si j'exécute un programme à partir du shell, et il segfaults:
$ buggy_program
Segmentation fault
Il me dira cependant qu'il existe un moyen d'obtenir des programmes pour imprimer une trace, peut-être en exécutant quelque chose comme ceci:
$ print_backtrace_if_segfault buggy_program
Segfault in main.c:35
(rest of the backtrace)
Je préfère également ne pas utiliser strace ou ltrace pour ce type d'informations, car ils s'impriment de toute façon ...
Désolé de venir ici 2 ans plus tard ... tombé sur tout en cherchant autre chose. Ajouter 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
Vous obtiendriez un rapport avec backtrace, des bibliothèques chargées, etc.
2) Un script wrapper
catchsegv
est également disponible qui tenterait d'utiliseraddr2line
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)
la source
LD_PRELOAD=libSegFault.so
ça va si c'est dans le chemin dl.Vous avez besoin de l'ami de tout le monde GDB
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 à partir de gdb, vous pouvez définir des points d'arrêt arbitraires et examiner le contenu de la mémoire, etc.
la source
catchsegv
Il a été mentionné dans une autre réponse (mais en aucun cas concentré sur). C'est un outil pratique intégré au projet glibc. Il ne fournira une trace (et d'autres informations de débogage utiles) que si un programme fait effectivement une erreur de segmentation.
Une bonne rédaction existe ici .
Vous pouvez l'inclure dans vos propres scripts comme bon vous semble.
la source
Ubuntu (en tant que projet) utilise Apport pour ce faire. Vous pouvez voir comment ils l'ont fait.
https://wiki.ubuntu.com/Apport
la source
/proc/sys/kernel/core_pattern
Voici une variante légèrement modifiée du script de Kyle Brandt. Il est amélioré des manières suivantes:
Scénario:
la source
-ex
place.gdb ... -ex 'set pagination off' -ex backtrace -ex quit