Qu'est-ce qu'un défaut de segmentation?

27

Dans Ubuntu, j'ai rencontré l'erreur de segmentation à plusieurs reprises. Qu'est-ce qu'un défaut de segmentation et quand survient-il?

Tachyons
la source
1
Juste pour le cacher: j'ai eu un problème similaire, alors que mes défauts de segmentation n'étaient pas reproductibles de manière fiable et ils provenaient d'applications (presque) aléatoires. J'ai découvert que ma mémoire est probablement brisée. Donc, si tout programme provoque des erreurs de segmentation, on pourrait regarder de plus près la RAM.

Réponses:

25

Une erreur indiquant une erreur de segmentation (ou segfault , ou SIGSEGV ) dans Ubuntu et autres Unix comme les systèmes d' exploitation, ou en disant erreur de protection générale dans Windows, est lorsqu'un programme tente d'accéder à une partie de la mémoire qui ne sont pas accessibles, ou que le programme est interdit d'accès. Un défaut de segmentation est une sorte de plantage du programme, c'est-à-dire une interruption anormale d'un programme. Voir les articles de Wikipedia sur les plantages , la protection de la mémoire , la panne de segmentation , la panne de protection générale et SIGSEGV pour plus d'informations (et une compréhension plus texturée du sujet que celle présentée ici).

Une erreur de segmentation est presque toujours due à un bogue dans le programme où elle se produit. Je suppose que la plupart ou la totalité de vos erreurs de segmentation se produisent à partir de la même application. Veuillez fournir plus de détails sur les circonstances dans lesquelles des erreurs de segmentation se produisent sur votre machine et sur le programme qui plante. Veuillez également fournir le texte complet et exact du message d'erreur que vous recevez et de tout autre message qui apparaît devant lui. Cela devrait nous permettre de fournir des conseils détaillés spécifiques à votre problème (plutôt que de simples informations générales sur ce qu'est un défaut de segmentation).

La meilleure façon pour vous de fournir ces informations est de modifier votre question pour l'inclure . Alternativement, si vous voulez que cette question concerne uniquement les défauts de segmentation en général, vous pouvez poster une nouvelle question pour demander ce qui cause spécifiquement vos défauts de segmentation (si vous le faites, assurez-vous de fournir tous ces détails dans votre nouvelle question) .

Eliah Kagan
la source
heureusement, tous les défauts de segmentation sont corrigés en mettant à niveau os :). Ma question concerne le défaut de segmentation en général. Pas pour une application particulière.
Tachyons
@ I'mnotthisperson J'ai modifié ma réponse en conséquence. (Je conserve les instructions pour fournir plus d'informations, au profit d'autres utilisateurs rencontrant des erreurs de segmentation, même si je sais que vous n'avez pas besoin d'une assistance spécifique pour le moment.)
Eliah Kagan
Eh bien, il s'agit d'un défaut de segmentation dans une application. Je voulais poser des questions à ce sujet dans un programme C ++ où, comme le même programme fonctionne parfaitement bien sous Windows ou Turbo C ++ (dans wine) (j'utilise anjuta sous Linux) .Et bien ce ne sont que des programmes de base et non des applications (des programmes comme TREES , GRAPHIQUES, etc.)
Nirmik
Merci. Mais je crains que dans la plupart des cas, poser une question sur le défaut de segmentation dans l'application soit hors sujet ici. :)
Tachyons
@Nirmik: c'est probablement le sujet de stackoverflow :)
Tachyons
4

L'erreur de segmentation est causée par un bogue dans l'application. Techniquement, cela signifie que l'application essaie de lire ou d'écrire sur une partie de la mémoire qui ne lui appartient pas (ou n'existe pas). Il est bien sûr interdit de lire ou d'écrire dans la mémoire de quelqu'un d'autre et lorsque le système (noyau) le détecte, cela forcera l'application à se fermer.

Vojtech Trefny
la source
0

Il est révolu le temps où les gens avaient l'habitude de tracer le code de l'assembly et de déboguer un problème. Abends, Dr Watson, faute de segmentation. Ces jours verts sont partis.

L'une des raisons d'une erreur de segmentation est lorsque le code qui a un accès direct à la mémoire échoue. Lorsqu'un morceau de code tente d'accéder au segment de mémoire d'une autre application, une erreur de segmentation se produit. Les allocations de mémoire sont parfois déplacées pour permettre l'allocation de blocs de mémoire contigus plus grands. Pendant qu'il essaie de récupérer, le noyau s'efforce de sauvegarder toutes ses informations de mémoire dans un fichier, l'état actuel de toutes les applications en cours d'exécution sur le processeur et leur état (dernière instruction exécutée) dans un fichier et il vient de mourir. Il essaiera également de stocker autant d'informations de récupération et de fermer autant de fichiers que possible, afin que les disques durs n'obtiennent pas de liens rompus.

Déboguez-le et corrigez-le si vous pouvez le reproduire souvent. Si vous ne pouvez pas le reproduire, joignez simplement vos mains, agenouillez-vous et priez comme l'enfer pour que vous ne le voyiez pas "régulièrement".

Siddharth
la source
Segfaults peut être déclenché dans n'importe quel programme écrit dans une langue qui permet un accès direct à la mémoire. Ils ne planteront généralement pas le noyau non plus.
Alex L.
@AlexL. c'est exact. Je vais modifier ma réponse.
Siddharth
J'espère avoir correctement représenté mes pensées.
Siddharth
@AlexL. Pouvez-vous s'il vous plaît l'examiner une fois de plus. Je vais le supprimer, si ce n'est toujours pas exact.
Siddharth
C'est mieux. Pourtant, (1) bien que cela soit possible, il est extrêmement rare qu'un programme définisse le SIGSEGVgestionnaire sur autre chose que SIG_DFL(qui est de vider le noyau et de quitter pour a SIGSEGV) car si vous accédez à la mémoire que vous ne devriez pas l'être, alors quelque chose est allé très mal et la récupération est probablement impossible. (2) Un core ne sera sauvegardé qu'une fois le processus arrêté. (3) Le vidage de mémoire ne comprend que la mémoire et les registres du processus qui a été vidé. (4) Les autres processus, le CPU et le kernal ne sont pas affectés par une erreur de segmentation d'un autre processus.
Alex L.