En GDB, ¿cómo puedo saltar directamente al marco de la pila de llamadas más alto?

9

Tengo un programa C que falla después de descender profundamente en un desorden recursivo infinito. Retroceder el proceso en GDB es inútil porque el marco de la pila de llamadas tiene al menos 1000 cuadros de profundidad, y las llamadas a funciones repetidas son series de cuatro llamadas a funciones recursivas comunes (por lo que los puntos de interrupción parecen inútiles). Las llamadas repetidas para retroceder solo leen los cuatro nombres de funciones, una y otra y otra vez. Se me ocurrió que hacer 'arriba' 'arriba' 'arriba' ... me llevaría más arriba, así podría ver dónde comenzó a ocurrir este patrón, pero parece que sería más eficiente comenzar desde la llamada más alta apilar marco y bajar, porque mi presentimiento es que la recursión infinita comienza temprano en el proceso. Si la pila de llamadas tuviera un total de N cuadros, sé que podría hacer

gdb>> up N

para llegar a la parte superior de la pila (el enésimo marco), pero el problema es que no sé N. ¿Hay un comando para encontrar el número total de marcos en la pila de llamadas? ¿O hay un comando GDB incorporado para saltar al cuadro superior? Se me ocurrió que el cuadro superior debería ser la función main () . ¿Puedo aprovechar ese conocimiento para llegar al cuadro superior?

Dandrews
fuente

Respuestas:

9

En mis pruebas, usar 'arriba' con un número muy grande resultó en la visualización del cuadro superior, p. Ej.

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

fuente
1
No funciona si el tamaño de la pila es mayor que 99999
The Vivandiere
Esta respuesta funcionó para mí, solo necesitaba usar un número mayor.
tesch1
23

Puede especificar 'bt' con un número negativo para comenzar desde el cuadro superior:

bt -20

Luego puede usar 'marco' (o 'f') para ir directamente al marco que desee.

BlakBat
fuente
1

fr 0te llevará al marco de pila más alto. frsignifica marco.

El Vivandiere
fuente
2
esa es la dirección equivocada
tesch1
@ tesch1 lo suficientemente justo, pero gdb backtrace te muestra la parte inferior en la parte superior :)
The Vivandiere