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?

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 ()

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.


1

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


2
essa é a direção errada
tesch1

@ justo tesch1, mas backtrace mostra GDB-lhe o fundo em cima :)
O Vivandiere
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.