No GDB, como posso pular diretamente para o quadro da pilha de chamadas mais alto?

9

Eu tenho um programa C que seg falha após descer profundamente em uma bagunça recursiva infinita. O retrocesso do processo no GDB é inútil porque o quadro da pilha de chamadas tem pelo menos 1000 quadros de profundidade e as chamadas de função repetidas são uma série de quatro chamadas de função recursivas comuns (portanto, os pontos de interrupção parecem inúteis). Chamadas repetidas para backtrace apenas lê os quatro nomes das funções, repetidamente. Ocorreu-me que fazer 'up' 'up' 'up' ... me elevaria ainda mais, para que eu pudesse ver onde esse padrão começou a ocorrer, mas parece que seria mais eficiente começar da chamada superior empilhe o quadro e desça, porque meu palpite é que a recursão infinita começa no início do processo. Se a pilha de chamadas tivesse N quadros no total, eu sei que poderia fazer

gdb>> up N

para chegar ao topo da pilha (o enésimo quadro), mas o problema é que não conheço N. Existe um comando para encontrar o número total de quadros na pilha de chamadas? Ou existe um comando GDB embutido para saltar para o quadro mais alto? Ocorreu-me que o quadro superior deveria ser a função main () - posso aproveitar esse conhecimento para chegar ao quadro superior?

dandrews
fonte

Respostas:

9

Nos meus testes, usar 'up' com um número muito grande resultou na exibição do quadro superior, por exemplo

(gdb) up 99999
#58 0x0000000000442fb4 in main ()

fonte
11
Não funciona se o tamanho da pilha é maior do que 99999
O Vivandiere
Esta resposta funcionou para mim, só precisava usar um número maior.
tesch1
23

Você pode especificar 'bt' com um número negativo para iniciar do quadro superior:

bt -20

Você pode usar o 'quadro' (ou 'f') para ir diretamente para o quadro que deseja.

BlakBat
fonte
1

fr 0levará você ao quadro de pilha mais alto. frsignifica quadro.

The Vivandiere
fonte
2
essa é a direção errada
tesch1
@ justo tesch1, mas backtrace mostra GDB-lhe o fundo em cima :)
O Vivandiere