Pergunta

Eu tenho o seguinte problema com o meu programa C: Em algum lugar é um estouro de pilha. Apesar de compilar sem otimização e com símbolos do depurador, o programa termina com esta saída (dentro ou fora do gdb no Linux):

Programa terminou com SIGSEGV sinal, falha de segmentação. O programa não existe mais.

A única maneira que eu poderia detectar que este realmente é o estouro de pilha estava correndo o programa através valgrind. Existe alguma maneira que eu possa de alguma forma forçar o sistema operacional para descarregar a pilha de chamadas que iria me ajudar a localizar o problema?

Infelizmente, gdb não permite-me para tocar facilmente no programa também.

Foi útil?

Solução

Se você permitir que o sistema arquivos principais despejo pode analisá-los com gdb:

$ ulimit -c unlimited # bash sentence to allow for infinite sized cores
$ ./stack_overflow
Segmentation fault (core dumped)
$ gdb -c core stack_overflow
gdb> bt
#0  0x0000000000400570 in f ()
#1  0x0000000000400570 in f ()
#2  0x0000000000400570 in f ()
...

Algumas vezes eu vi um arquivo core mal gerado que teve um rastreamento de pilha incorreto, mas na maioria dos casos, a BT irá produzir um monte de chamadas recursivas ao mesmo método.

O arquivo de núcleo pode ter um nome diferente, que poderia incluir o ID do processo, que depende da configuração padrão do kernel em seu sistema atual, mas pode ser controlada com (run como root ou com o sudo):

$ sysctl kernel.core_uses_pid=1

Outras dicas

Com GCC você pode tentar este:

-fstack-protector
Emitem código extra para verificar se há estouros de buffer, como ataques Stack Smashing. Isto é feito através da adição de uma variável guarda para funções com objetos vulneráveis. Isto inclui funções que chamam alloca, e funções com buffers maiores do que 8 bytes. Os guardas são inicializados quando uma função é inserido e, em seguida, verificado quando a função sai. Se um cheque guarda falhar, uma mensagem de erro é impresso e sai do programa.

-fstack-protector-all
Como -fstack-protector, exceto que todas as funções estão protegidos.

http: // gcc. gnu.org/onlinedocs/gcc-4.3.3/gcc/Optimize-Options.html#Optimize-Options

Quando um programa morre com SIGSEGV, ele normalmente lixeiras núcleo no Unix. Você poderia carregar esse núcleo em depurador e verificar o estado da pilha?

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