web-dev-qa-db-fra.com

L'exécution de l'application se termine par "Erreur de segmentation"

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 à un certain moment, laisse le message:

Segmentation fault

Qu'est-ce que ça veut dire? Que devrais-je faire?

43
goldilocks

Un défaut 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 ce qui lui a été alloué, et le noyau du système d'exploitation répond en tuant le programme avec SIGSEGV.

Il s'agit d'une erreur, car il est inutile d'essayer d'accéder à une mémoire inaccessible (cela ne peut pas être fait). Des erreurs de ce type sont cependant faciles à faire, en particulier dans des langages tels que le C et le C++ (qui représentent de nombreuses applications courantes). Il indique un bogue dans le programme lui-même ou dans une bibliothèque vers laquelle il est lié. Si vous souhaitez signaler le bug (faire - cela aide), c'est une bonne idée d'inclure une trace arrière des événements qui ont conduit à la faute de seg.

Pour ce faire, vous pouvez exécuter le programme à l'intérieur de gdb (le débogueur GNU), qui devrait être disponible depuis n'importe quelle distribution Linux s'il n'est pas déjà installé (le paquetage être appelé "gdb"). Si l'application cassée est appelée "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 run et appuyez sur Entrée. Si vous devez fournir des arguments (par exemple -x --foo=bar whatever) ajoutez ceux (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 un GUI, à l'intérieur de gdb). Au point où il se sépare généralement, vous verrez:

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

La deuxième ligne de sortie ici n'est qu'un exemple. Tapez maintenant bt (pour "backtrace") et appuyez sur Entrée. Vous verrez quelque chose comme ça, même si cela peut être beaucoup plus long:

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

S'il est plus long, vous n'aurez qu'un écran à la fois et il y aura un --More-- message. Continuez à frapper entrer jusqu'à ce que ce soit fait. Vous pouvez maintenant quit, la sortie restera dans votre terminal. Copiez tout depuis Program received signal SIGSEGV en avant dans un fichier texte et déposer un rapport de bogue avec l'outil de suivi des bogues de l'application; vous pouvez les trouver en ligne en recherchant, par ex. "rapport de bug brokenapp" - vous devrez probablement vous inscrire afin qu'une réponse puisse vous être envoyée par e-mail. Incluez votre description du problème, tous les arguments que vous avez fournis à run, etc., et une copie de la trace arrière (si elle est très longue, il peut y avoir un moyen de joindre un fichier texte dans l'interface de suivi des bogues ). Incluez également la version, si vous savez de quoi il s'agit (brokenapp --version peut fonctionner, ou la page de manuel peut indiquer comment l'obtenir) et la distribution que vous utilisez.

J'espère que quelqu'un vous répondra dans peu de temps. Le dépôt de bogues est généralement apprécié.

68
goldilocks

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 fourni avec une distribution Linux, vous devez créer un rapport de bogue pour cette distribution.
    • Pour les applications non commerciales tierces, vous devez signaler le bogue à l'auteur ou à ce traqueur de bogue d'application particulier. Habituellement, vous pouvez trouver de la place en parcourant le site d'application ou le package binaire/source téléchargé.
    • Pour les applications commerciales, vous devez contacter le support.
  • S'il s'agit de votre propre application, vous pouvez:

    1. activer les fichiers principaux: $ ulimit -c unlimited
    2. reproduire le crash: $ ./yourapp
    3. crash de débogage avec gdb: $ gdb ./yourapp core

Les fichiers de base seront également très utiles pour les développeurs autres que vous - ils contiennent l'état complet du programme au moment du crash; si vous allez déposer un rapport de bogue, joignez-les et, dans certains cas, votre application binaire. Sachez qu'il y a peu de chances que vos données personnelles telles que les numéros de compte, les mots de passe et similaires puissent rester dans la mémoire du programme au moment du crash. Dans de nombreux cas, le simple fait de rapporter une trace de thread écrasé aide les développeurs à trouver le problème. Pour obtenir une trace, vous pouvez charger le fichier principal avec le débogueur (comme gdb executable corefile).

12
gena2x