O que é uma falha de segmentação?

27

No Ubuntu, já enfrentei o erro de falha de segmentação muitas vezes. O que é uma falha de segmentação e quando ocorre?

Tachyons
fonte
1
Apenas para encobrir: tive um problema semelhante, enquanto meus segfaults não eram reproduzíveis com confiabilidade e eram provenientes de aplicativos (quase) aleatórios. Descobri que provavelmente minha memória está quebrada. Portanto, se qualquer programa causa segfaults, é possível examinar mais de perto a RAM.

Respostas:

25

Um erro ao dizer falha de segmentação (ou segfault ou SIGSEGV ) no Ubuntu e outros sistemas operacionais semelhantes ao Unix, ou dizendo falha de proteção geral no Windows é quando um programa tenta acessar uma parte da memória que não pode ser acessada ou para qual programa. é proibido acessar. Uma falha de segmentação é um tipo de falha no programa, ou seja, um encerramento anormal de um programa. Veja os artigos da Wikipedia sobre acidentes , proteção de memória , falha de segmentação , falha de proteção geral , e SIGSEGV para mais informações (e uma compreensão mais texturizada do tema do que é apresentado aqui).

Uma falha de segmentação ocorre quase sempre devido a um erro no programa em que ocorre. Suponho que a maioria ou todas as suas falhas de segmentação estejam ocorrendo no mesmo aplicativo. Forneça mais detalhes sobre as circunstâncias em que as falhas de segmentação estão acontecendo em sua máquina e qual programa está travando. Forneça também o texto completo e exato da mensagem de erro que você está recebendo e quaisquer outras mensagens que aparecerem antes dela. Isso deve permitir que forneçamos conselhos detalhados específicos para o seu problema (em vez de apenas informações gerais sobre o que é uma falha de segmentação).

A melhor maneira de fornecer essas informações é editar sua pergunta para incluí-la . Como alternativa, se você deseja que esta pergunta seja apenas sobre falhas de segmentação em geral, você pode postar uma nova pergunta para perguntar o que especificamente está causando suas falhas de segmentação (se você fizer isso, forneça todos esses detalhes em sua nova pergunta) .

Eliah Kagan
fonte
felizmente, todas as falhas de segmentação são corrigidas com a atualização do os :). Minha pergunta é sobre falha de segmentação em geral. Não para um aplicativo específico.
Tachyons
@ Não sou essa pessoa; editei minha resposta de acordo. (Estou mantendo as direções para fornecer mais informações, para o benefício de outros usuários que experimentam falhas de segmentação, embora eu saiba que você não precisa de assistência específica com eles agora.)
Elias Kagan
Bem, isso é sobre uma falha de segmentação em um aplicativo. Eu queria perguntar sobre isso ocorrendo em um programa C ++, onde o mesmo programa é executado perfeitamente no Windows ou no Turbo C ++ (no wine) (eu uso anjuta no Linux). E bem, esses são apenas programas básicos e não aplicativos (Programas como TREES , GRAPHS, etc)
Nirmik
Obrigado .Mas, na maioria dos casos, receio que a pergunta sobre falha de segmentação no aplicativo seja offtopic aqui. :)
Tachyons
@Nirmik: provavelmente é o tópico para stackoverflow :)
Tachyons
4

A falha de segmentação é causada por um erro no aplicativo. Tecnicamente, significa que o aplicativo tenta ler ou gravar em parte da memória que não pertence a ele (ou não existe). Obviamente, é proibido ler ou gravar na memória de outra pessoa e quando o sistema (kernel) detectar isso, forçará o encerramento do aplicativo.

Vojtech Trefny
fonte
0

Longe vão os dias em que as pessoas costumavam rastrear o código do assembly e depurar um problema. Abends, Dr. Watson, falha na segmentação. Esses dias verdes se foram.

Um dos motivos para uma falha de segmentação é quando o código que tem acesso direto à memória falha. Quando um trecho de código tenta acessar o segmento de memória de um aplicativo diferente, ocorre uma falha de segmentação. Algumas vezes, as alocações de memória são movidas para permitir que blocos maiores de memória sejam alocados. Enquanto tenta se recuperar, o kernel tenta salvar todas as informações de memória em um arquivo, o estado atual de todos os aplicativos em execução na CPU e seu estado (última instrução executada) em um arquivo e simplesmente morre. Ele também tentará armazenar o máximo de informações de recuperação e fechar o máximo de arquivos possível, para que os discos rígidos não obtenham links quebrados.

Depure-o e corrija-o se você puder reproduzi-lo frequentemente. Se você não conseguir reproduzi-lo, apenas junte suas mãos, ajoelhe-se e ore como o inferno para que não o veja "regularmente".

Siddharth
fonte
Segfaults podem ser acionados em qualquer programa escrito em um idioma que permita acesso direto à memória. Geralmente, eles também não travam o kernel.
Alex L.
@AlexL. isso é preciso. Vou editar minha resposta.
Siddharth
Espero ter representado meus pensamentos corretamente.
Siddharth
@AlexL. Você pode revisá-lo mais uma vez. Vou excluí-lo, se ainda não for preciso.
Siddharth
Isto é melhor. Ainda assim, (1) embora seja possível, é extremamente raro um programa definir o SIGSEGVmanipulador para algo diferente de SIG_DFL(que é despejar o núcleo e sair para a SIGSEGV), pois se você estiver acessando a memória, não deveria estar, então algo ocorreu muito errado e recuperação é provavelmente impossível. (2) Um núcleo será descartado apenas quando o processo for interrompido. (3) O dump principal inclui apenas a memória e os registros do processo que foi despejado. (4) Outros processos, a CPU e o kernal não são afetados por uma falha de outro processo.
Alex L.