A aplicação em execução termina com "Falha de segmentação"

40

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

Segmentation fault

O que isto significa? O que devo fazer?

Cachinhos Dourados
fonte
related: stackoverflow.com/questions/2876357/…
Ciro Santilli escreveu:

Respostas:

63

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

Isso é um erro, pois não faz sentido tentar acessar a memória inacessível (isso não pode ser feito). É fácil cometer erros desse tipo, principalmente em linguagens como C e C ++ (que são responsáveis ​​por muitos aplicativos comuns). Indica um erro no próprio programa ou em uma biblioteca à qual ele se vincula. Se você deseja relatar o bug (faça - isso ajuda), é uma boa ideia incluir um rastreamento dos eventos que levaram à falha seg.

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

gdb brokenapp

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

(gdb) _ 

Digite rune pressione enter. Se você precisar fornecer argumentos (por exemplo -x --foo=bar whatever), adicione-os ( run -x --foo=bar whatever). O programa fará o que faz, você verá a saída e, se precisar interagir, poderá (observe que você pode executar qualquer tipo de programa, incluindo um GUI, dentro do gdb). No ponto em que geralmente se segmenta, 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 pressione 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ê receberá apenas uma tela por vez e haverá uma --More--mensagem. Continue pressionando enter até terminar. Agora você pode quit, a saída permanecerá no seu terminal. Copie tudo a partir de agora Program received signal SIGSEGVem 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, "relatório de bug do brokenapp" - você provavelmente precisará se registrar para que uma resposta possa ser enviada por e-mail. Inclua sua descrição do problema, todos os argumentos que você forneceu 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 erros). Inclua também a versão, se você souber o que é ( brokenapp --versionpode funcionar ou a página do manual pode indicar como obter isso),

Esperamos que alguém volte em breve. Arquivar bugs é geralmente apreciado.

Cachinhos Dourados
fonte
11
Falha na segmentação também pode ocorrer em idiomas de intérpretes (por isso é principalmente porque erros no próprio intérprete),
Braiam
Isso é super útil! Existe a possibilidade de entrar? colocar um ponto de parada e tentar descobrir mais?
Zloy Smiertniy
11
@ZloySmiertniy gdbfaz muitas coisas . Você quer que a clicar para seção 5.1
Goldilocks
11

Isso significa que o aplicativo possui um erro.

  • 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 relatar o bug ao autor ou a este rastreador de aplicativos específico. Normalmente, você pode encontrar um local navegando no site do aplicativo ou no pacote binário / fonte baixado.
    • Para aplicativos comerciais, entre em contato com o suporte.
  • Se for seu próprio aplicativo, você pode:

    1. ative os arquivos principais: $ ulimit -c unlimited
    2. reproduzir a falha: $ ./yourapp
    3. falha de depuração com gdb: $ gdb ./yourapp core

Os arquivos principais também serão muito úteis para outros desenvolvedores que não você - eles contêm o estado completo do programa no momento do travamento; se você deseja registrar um relatório de bug, anexe-o e, em alguns casos, seu aplicativo binário. Esteja ciente de que há poucas chances de que seus dados pessoais, como números de conta, senhas e similares, possam permanecer na memória do programa no momento do travamento. Em muitos casos, relatar apenas o backtrace do encadeamento travado é uma grande ajuda para os desenvolvedores encontrarem o problema. Para obter um rastreamento, você pode carregar o arquivo principal com o depurador (como gdb executable corefile).

gena2x
fonte
De acordo com a caixa de diálogo da Microsoft, você deve entrar em contato apenas com o fornecedor "se o problema persistir"; caso contrário, não se preocupe. Falhas raras não são erros reais, apenas reproduzíveis.
Kaz
4
Minha observação é que a qualidade do software Microsoft é baixa em muitos casos em comparação com o software UNIX, e é bom que no mundo UNIX as pessoas geralmente não se refiram às suas diretrizes.
Gena2x # 28/14