GNU/Linux >> Tutoriels Linux >  >> Linux

Pouvez-vous faire en sorte que n'importe quel programme sous Linux imprime une trace de pile en cas d'erreur de segmentation ?

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


Linux
  1. Comment avez-vous commencé avec Linux ?

  2. Processus de démarrage Linux :un guide pour démarrer

  3. Pouvez-vous exécuter Xcode sous Linux ?

  4. Comment obtenir une trace de pile pour C++ en utilisant gcc avec des informations de numéro de ligne ?

  5. Comment obtenir l'identifiant de thread d'un pthread dans le programme linux c?

Comment suivre l'exécution d'un programme à l'aide de la commande Linux Strace

13 façons d'aider Linux

Les meilleurs magazines Linux auxquels vous pouvez vous abonner

Avez-vous besoin de Java ? Vous pouvez donc l'installer Java sur Linux

Pouvez-vous faire mieux ? 15 exemples pratiques de commandes principales Linux

Parcours d'un programme C vers un exécutable Linux en 4 étapes