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?
Puede especificar 'bt' con un número negativo para comenzar desde el cuadro superior:
Luego puede usar 'marco' (o 'f') para ir directamente al marco que desee.
fuente
fr 0
te llevará al marco de pila más alto.fr
significa marco.fuente