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.