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?
debugging
segmentation-fault
Cachinhos Dourados
fonte
fonte
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":Um parágrafo sobre direitos autorais e licenciamento será exibido e, no final, um prompt com o cursor:
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á: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:Se for mais longo, você receberá apenas uma tela por vez e haverá uma
--More--
mensagem. Continue pressionando enter até terminar. Agora você podequit
, a saída permanecerá no seu terminal. Copie tudo a partir de agoraProgram 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ê forneceurun
, 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.
fonte
gdb
faz muitas coisas . Você quer que a clicar para seção 5.1Isso 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
).fonte