A execução da aplicação termina com “Falha de segmentação”

38

Eu tenho um aplicativo de linha de comando que, quando executado, não faz o que deve fazer e, em determinado momento, deixa a mensagem:

Segmentation fault

O que isso significa? O que devo fazer?

    
por goldilocks 27.05.2014 / 14:29

2 respostas

58

Uma falha de segmentação é o resultado de uma violação de acesso à memória. O programa referiu-se a um endereço de memória fora do que foi alocado para ele, e o kernel do sistema operacional responde matando o programa com SIGSEGV.

Isso é um erro, já que não há sentido em tentar acessar a memória inacessível (isso não pode ser feito). Erros deste tipo são fáceis de fazer, no entanto, particularmente em linguagens como C e C ++ (que são responsáveis por muitas aplicações comuns). Indica um erro no próprio programa ou em uma biblioteca à qual ele está vinculado. Se você deseja reportar o bug (isso ajuda), é uma boa idéia incluir um backtrace dos eventos que levaram à falha seg.

Para fazer isso, você pode executar o programa dentro de gdb (o depurador GNU), que deve estar disponível a partir de qualquer distribuição do Linux, caso ainda não esteja instalado (o pacote será chamado apenas de "gdb"). Se o aplicativo quebrado for chamado de "brokenapp":

gdb brokenapp

Um parágrafo sobre direitos autorais e licenciamento será exibido e, no final, um aviso com o cursor:

(gdb) _ 

Digite run e aperte enter. Se você precisar fornecer argumentos (por exemplo, -x --foo=bar whatever ), anexe esses ( run -x --foo=bar whatever ). O programa fará o que ele faz, você verá a saída e se você precisar interagir você pode (note que você pode executar qualquer tipo de programa, incluindo um GUI, dentro do gdb). No ponto em que geralmente segfaults você verá:

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

A segunda linha de saída aqui é apenas um exemplo. Agora digite bt (para "backtrace") e aperte enter. Você verá algo assim, embora possa demorar muito mais:

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

Se for mais longo, você só receberá uma tela por vez e haverá uma mensagem --More-- . Continue pressionando enter até terminar. Você pode agora quit , a saída permanecerá no seu terminal. Copie tudo de Program received signal SIGSEGV para um arquivo de texto e envie um relatório de erro com o rastreador de erros do aplicativo; você pode encontrá-los on-line pesquisando, por exemplo "brokenapp bug report" - você provavelmente terá que se registrar para que uma resposta possa ser enviada para você por e-mail. Inclua sua descrição do problema, quaisquer argumentos que você forneceu para run , etc., e uma cópia do backtrace (se for muito longo, pode haver um meio de anexar um arquivo de texto na interface do rastreador de bugs). Inclua também a versão, se você sabe o que é ( brokenapp --version pode funcionar, ou a página man pode indicar como obter isso) e qual distribuição você está usando.

Espero que alguém volte para você em não muito tempo. Erros de arquivamento geralmente são apreciados.

    
por 27.05.2014 / 14:29
11

Isso significa que o aplicativo tem um bug.

  • Se você é um usuário final, entre em contato com o fornecedor do aplicativo.

    • Se ele veio com uma distribuição Linux, você deve criar um relatório de bug para essa distribuição.
    • Para aplicativos não comerciais de terceiros, você deve informar o bug ao autor ou a este aplicativo específico. Normalmente, você poderia encontrar um lugar navegando no site do aplicativo ou baixando o pacote binário / fonte.
    • Para aplicativos comerciais, você deve entrar em contato com o suporte.
  • Se for sua própria aplicação, você pode:

    1. ativar arquivos principais: $ ulimit -c unlimited
    2. reproduza a falha: $ ./yourapp
    3. depurar falha com gdb: $ gdb ./yourapp core

Os arquivos principais também serão muito úteis para os desenvolvedores que não sejam você mesmo - eles contêm o estado completo do programa no momento da falha; Se você for enviar um relatório de bug, anexe-o e, em alguns casos, o binário do aplicativo. Esteja ciente de que há uma pequena chance de que seus dados pessoais, como números de contas, senhas e similares, permaneçam na memória do programa no momento da falha. Em muitos casos, reportar apenas o backtrace do thread travado é uma grande ajuda para os desenvolvedores encontrarem o problema. Para obter o backtrace, você pode carregar o arquivo principal com o depurador (como gdb executable corefile ).

    
por 27.05.2014 / 17:25