Pergunta

Existe alguma opção gcc posso definir que vai me dar o número da linha da falha de segmentação?

Eu sei que eu posso:

  1. linha de depuração por linha
  2. Coloque printfs no código para diminuir.

Edições:

  1. bt / where no gdb dar Não pilha.
  2. sugestão útil
Foi útil?

Solução

Eu não sei de uma opção de gcc, mas você deve ser capaz de executar o aplicativo com gdb e então quando ele trava, tipo where para dar uma olhada na pilha quando ele saiu, que deverá fazê-lo perto.

$ gdb blah
(gdb) run
(gdb) where

Editar para a integralidade:

Você também deve certificar-se de construir a aplicação com sinalizadores de depuração em usar a opção -g gcc para incluir números de linha no executável.

Outra opção é usar o comando bt (backtrace).

Outras dicas

Aqui está um shell sessão completa / gdb

$ gcc -ggdb myproj.c
$ gdb a.out
gdb> run --some-option=foo --other-option=bar
(gdb will say your program hit a segfault)
gdb> bt
(gdb prints a stack trace)
gdb> q
[are you sure, your program is still running]? y
$ emacs myproj.c # heh, I know what the error is now...

Happy Hacker: -)

Você pode obter gcc para imprimir-lhe uma stacktrace quando o programa recebe um sinal SEGV, semelhante à forma como Java e outras linguagens mais amigáveis ??lidar com exceções de ponteiro nulo. Veja minha resposta aqui para mais detalhes:

A coisa agradável sobre este é que você pode apenas deixá-lo em seu código; você não precisa executar as coisas através gdb para obter a saída de depuração agradável.

Se você compilar com -g e siga as instruções lá, você pode usar uma ferramenta de linha de comando como addr2line para obter informações do arquivo / linha a partir da saída.

executá-lo sob valgrind.

Você também precisa construir com sinalizadores de depuração na -g

Você também pode abrir o despejo núcleo com gdb (você precisa -g embora).

Se todas as sugestões anteriores para compilar com a depuração (-g) e correr sob um depurador (gdb, correr, bt) não estão funcionando para você, então:

  • Elementar: Talvez você não estiver executando sob o depurador, você está apenas tentando analisar o core dump postmortem. (Se você iniciar uma sessão de depuração, mas não executar o programa, ou se ele sai, então, quando você pedir um registo de chamadas, gdb vai dizer "Não pilha" - porque não há nenhum programa em execução em tudo Não se esqueça. o tipo "run"). Se segfaulted, não se esqueça de adicionar o terceiro argumento (core) quando você executar gdb, caso contrário você começar no mesmo estado, não ligado a qualquer imagem de processo ou memória particular.
  • Difícil: Se seu programa é / foi realmente funcionando, mas o seu gdb está dizendo "Não pilha" talvez a sua stack pointer é mal esmagado. Nesse caso, você pode ser um lugar problema de estouro de buffer, o suficiente grave para esmagar seu estado de tempo de execução inteiramente. GCC 4.1 suporta a ProPolice "Stack Smashing Protector" que é ativado com -fstack-protector-all. Ele pode ser adicionado ao GCC 3.x com um patch.

Não existe um método para GCC para fornecer essa informação, você tem que confiar em um programa externo como o GDB.

GDB pode dar-lhe a linha onde um acidente ocorreu com o "bt" (abreviação de "backtrace") de comando após o programa tem seg criticada. Isto lhe dará não só a linha do acidente, mas toda a pilha do programa (para que você possa ver o que chamou a função onde o acidente aconteceu).

O problema No stack parece acontecer quando a saída do programa com sucesso.

Para o registro, eu tive esse problema porque eu tinha esquecido um retorno no meu código, o que fez a minha saída do programa com código de falha.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top