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?
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?
Respostas:
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 run
e 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 SIGSEGV
em 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 --version
pode funcionar ou a página do manual pode indicar como obter isso),
Esperamos que alguém volte em breve. Arquivar bugs é geralmente apreciado.
gdb
faz muitas coisas . Você quer que a clicar para seção 5.1
Isso significa que o aplicativo possui um erro.
Se você é um usuário final, entre em contato com o fornecedor do aplicativo.
Se for seu próprio aplicativo, você pode:
$ ulimit -c unlimited
$ ./yourapp
$ 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
).