número da linha de falha de segmentação
-
21-08-2019 - |
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:
- linha de depuração por linha
- Coloque printfs no código para diminuir.
Edições:
-
bt
/where
no gdb dar Não pilha. - sugestão ú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.