L'application en cours se termine par «Erreur de segmentation»

40

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?

boucle d'or
la source
connexes: stackoverflow.com/questions/2876357/…
Ciro Santilli a rejoint le groupe

Réponses:

63

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":

gdb brokenapp

Un paragraphe sur les droits d'auteur et les licences apparaîtra et, à la fin, une invite avec le curseur:

(gdb) _ 

Tapez runet 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:

Program received signal SIGSEGV, Segmentation fault.
0x00000000006031c9 in ?? ()
(gdb) _

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:

(gdb) bt
#0  0x00000000006031c9 in ?? ()
#1  0x000000000040157f in mishap::what() const ()
#2  0x0000000000401377 in main ()

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 maintenant quit, la sortie restera dans votre terminal. Copiez le tout Program received signal SIGSEGVdans 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 fournis run, 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 --versionpeut 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é.

boucle d'or
la source
1
Une erreur de segmentation peut également se produire dans les langages d'interprétation (principalement en raison de bogues dans l'interprète lui-même),
Braiam
C'est super utile! Y a-t-il une possibilité d'entrer à l'intérieur? mettre un point d'arrêt et essayer d'en savoir plus?
Zloy Smiertniy
1
@ZloySmiertniy gdbfait beaucoup de choses . Vous voulez cliquer sur la section 5.1
Goldilocks
11

Cela signifie que l'application a un bogue.

  • Si vous êtes un utilisateur final, vous devez contacter le fournisseur de l'application.

    • S'il est venu avec une distribution Linux, vous devriez créer un rapport de bogue pour cette distribution.
    • Pour les applications tierces non commerciales, vous devez signaler le bogue à l'auteur ou à cet outil particulier de suivi des bogues. Habituellement, vous pouvez trouver un lieu en parcourant le site de l'application ou le package binaire / source téléchargé.
    • Pour les applications commerciales, vous devez contacter le support.
  • Si c'est votre propre application, vous pouvez:

    1. activer les fichiers de base: $ ulimit -c unlimited
    2. reproduire le crash: $ ./yourapp
    3. débogage avec gdb: $ 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).

gena2x
la source
Selon la boîte de dialogue de Microsoft, vous ne devez contacter votre fournisseur "que si le problème persiste", sinon, ne vous inquiétez pas. Les accidents rares ne sont pas de vrais insectes, mais des problèmes reproductibles.
Kaz
4
Mon observation est que la qualité des logiciels Microsoft est souvent faible comparée à celle des logiciels UNIX, et il est intéressant de noter que sous UNIX, les utilisateurs ne se réfèrent généralement pas à leurs directives.
gena2x