J'ai une application en ligne de commande qui, lorsqu'elle est exécutée, ne fait pas ce qu'elle est censée faire et laisse un message à un moment donné:
Segmentation fault
Qu'est-ce que ça veut dire? Que devrais-je faire?
debugging
segmentation-fault
boucle d'or
la source
la source
Réponses:
Une erreur de segmentation est le résultat d'une violation d'accès à la mémoire. Le programme a fait référence à une adresse mémoire en dehors de celle qui lui avait été allouée, et le noyau du système d’exploitation répond en supprimant le programme avec SIGSEGV.
C'est une erreur, car il est inutile d'essayer d'accéder à une mémoire inaccessible (cela ne peut pas être fait). Les erreurs de ce type sont toutefois faciles à commettre, en particulier dans des langages tels que C et C ++ (qui représentent de nombreuses applications courantes). Il indique un bogue dans le programme lui-même ou dans une bibliothèque avec laquelle il est lié. Si vous souhaitez signaler le bogue (do - ceci aide), il est judicieux d'inclure une trace des événements qui ont conduit à l'erreur seg.
Pour ce faire, vous pouvez exécuter le programme à l'intérieur
gdb
(le débogueur GNU), qui devrait être disponible à partir de n'importe quelle distribution linux s'il n'est pas déjà installé (le paquet s'appellera simplement "gdb"). Si l'application endommagée s'appelle "brokenapp":Un paragraphe sur les droits d'auteur et les licences apparaîtra et, à la fin, une invite avec le curseur:
Tapez
run
et appuyez sur Entrée. Si vous avez besoin de fournir des arguments (par exemple-x --foo=bar whatever
), ajoutez ceux-ci (run -x --foo=bar whatever
). Le programme fera ce qu’il fait, vous verrez la sortie et si vous avez besoin d’interagir, vous pouvez (notez que vous pouvez exécuter n’importe quel type de programme, y compris une interface graphique, dans gdb). Au point où il se sépare habituellement, vous verrez:La deuxième ligne de sortie ici est juste un exemple. Maintenant, tapez
bt
(pour "backtrace") et appuyez sur Entrée. Vous verrez quelque chose comme ceci, bien que cela puisse être beaucoup plus long:Si c'est plus long, vous aurez seulement un écran à la fois et il y aura un
--More--
message. Continuez à entrer jusqu'à ce que ce soit terminé. Vous pouvez maintenantquit
, la sortie restera dans votre terminal. Copiez le toutProgram received signal SIGSEGV
dans un fichier texte et déposez un rapport de bogue avec le traqueur de bogues de l'application; vous pouvez les trouver en ligne en effectuant une recherche, par exemple "Rapport de bogue de brokenapp" - vous devrez probablement vous enregistrer pour qu'une réponse puisse vous être envoyée par courrier électronique. Incluez votre description du problème, les arguments que vous avez fournisrun
, etc., ainsi qu'une copie de la trace de suivi (s'il est très long, il est peut-être possible de joindre un fichier texte à l'interface de suivi des bogues). Incluez également la version, si vous savez ce que c'est (brokenapp --version
peut fonctionner, ou la page de manuel peut indiquer comment l'obtenir),J'espère que quelqu'un vous répondra dans peu de temps. Le classement des bogues est un phénomène généralement apprécié.
la source
gdb
fait beaucoup de choses . Vous voulez cliquer sur la section 5.1Cela signifie que l'application a un bogue.
Si vous êtes un utilisateur final, vous devez contacter le fournisseur de l'application.
Si c'est votre propre application, vous pouvez:
$ ulimit -c unlimited
$ ./yourapp
$ gdb ./yourapp core
Les fichiers core seront également très utiles pour les développeurs autres que vous-même - ils contiennent l’état complet du programme au moment du blocage; si vous allez déposer un rapport de bogue, attachez-le et, dans certains cas, votre binaire d'application. Sachez qu’il est peu probable que vos données personnelles, telles que les numéros de compte, les mots de passe, etc., restent en mémoire du programme au moment du blocage. Dans de nombreux cas, la création de rapports sur la trace d'un thread bloqué est une aide précieuse pour les développeurs afin de trouver le problème. Pour récupérer la trace, vous pouvez charger le fichier core avec le débogueur (du type
gdb executable corefile
).la source