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?
Você pode especificar 'bt' com um número negativo para iniciar do quadro superior:
Você pode usar o 'quadro' (ou 'f') para ir diretamente para o quadro que deseja.
fonte
fr 0
levará você ao quadro de pilha mais alto.fr
significa quadro.fonte