O que isso significa?
Veja AU: O que é uma falha de segmentação? e também este que tem alguns exemplos de como reproduzi-lo, SO: O que é falha de segmentação? . a descrição mais simples que posso incluir (pode não ser a perfeita):
O programa tentou acessar uma área de memória fora da própria seção. OS bloqueia.
Alguns casos: Leitura de valor com ponteiro inicializado, Saindo do intervalo em uma matriz, Chamada de função (quando a compatibilidade com versões anteriores não é mantida), ...
No entanto, nem sempre é fácil encontrar a causa em programas grandes ou nos que se baseiam em outras bibliotecas de projetos. E a maioria dos casos termina com um relatório de erro, para o programa de destino ou um para suas dependências (projeto upstream ou pacote de distribuição downstream).
Como posso resolver esse problema?
Se você não fez nenhuma configuração / instalação personalizada e todas as atualizações instaladas. Dispare um relatório de erro , consulte Como relato um erro?
Se o código aberto for suportado pelo Ubuntu, use ubuntu-bug( apport-bug). Para código fechado de terceiros, consulte as páginas de ajuda de como reportar bugs e coletar dados relacionados.
Nota: Se você possui um pouco de experiência em programação, é recomendável tentar o seu melhor para resolvê-lo. Existem muitos relatórios de bugs inativos por anos. Ou pelo menos colete dados de depuração suficientes para resolver o problema antes de relatá-lo.
Algumas ferramentas úteis para depuração
apport-bug logs / core dump / backtrace
Se você não tiver uma mensagem de erro antes da falha de segmentação. Execute-o com a --saveopção e procure o log de rastreamento posterior:
apport-bug program-cmd --save bug-report_output.txt
gdb código fonte de backtrace / depuração
Se não funcionou, use gdb:
$ gdb program-cmd
(gdb) run
(gdb) backtrace
Se você receber alguma mensagem de erro, verifique a web, a barra de ativação e o rastreador de erros do projeto upstream, se houver algum caso semelhante.
Para alguns usuários avançados ou que seguem o caminho de aprendizado do ac / c ++, eles podem baixar os -dbgpacotes de símbolos correspondentes . Em seguida, você pode usar gdbpara rastrear o fluxo do programa através da fonte e obter a função / instrução exata que gera o erro de tempo de execução.
strace rastreamento de chamada do sistema
Outra ferramenta que pode ajudar é strace, eu gosto. É realmente uma ferramenta poderosa.
Apresenta-se:
No caso mais simples, straceexecute o comando especificado até que ele saia. Ele intercepta e registra as chamadas do sistema chamadas por um processo e os sinais recebidos por um processo. O nome de cada chamada do sistema, seus argumentos e seu valor de retorno são impressos em erro padrão ou no arquivo especificado com a opção -o.
straceé uma ferramenta útil de diagnóstico, instrução e depuração. Os administradores de sistema, diagnosticadores e solucionadores de problemas acharão inestimável para solucionar problemas com programas para os quais a fonte não está prontamente disponível, pois eles não precisam ser recompilados para rastrear esses problemas. Estudantes, hackers e muito curiosos descobrirão que muito pode ser aprendido sobre um sistema e suas chamadas de sistema rastreando até programas comuns. E os programadores descobrirão que, como chamadas e sinais do sistema são eventos que acontecem na interface do usuário / kernel, um exame mais atento desse limite é muito útil para o isolamento de erros, verificação de sanidade e tentativa de capturar as condições de corrida.
Fonte: man strace
ltrace rastreamento de chamada de biblioteca dinâmica
ltraceé um programa que simplesmente executa o comando especificado até que ele saia. Ele intercepta e registra as chamadas da biblioteca dinâmica chamadas pelo processo executado e os sinais recebidos por esse processo. Também pode interceptar e imprimir as chamadas do sistema executadas pelo programa.
Seu uso é muito semelhante ao strace(1).
Fonte: man ltrace