2011-03-05 28 views
5

estoy depuración de código que tiene este aspecto:Depuración con GDB - cómo escapar de un bucle

while (true){ 
    // do something ... 
    size_t i = foo(); // <- bp set here 
    if (flag_set) break; 
} 

// More code follows here ... 

Quiero romper en la llamada a la función foo(), invoque un par de veces y luego salte del ciclo while por completo (supongamos que tenemos la garantía de que se establecerá la bandera, para que podamos salir del ciclo.

¿Cómo salgo completamente del ciclo ?. siguiente iteración. Lo que quiero hacer es salir del "fragmento de código" actual (en este caso, el ciclo while)

+0

¿Desea salir literalmente del ciclo (como si tuviera una instrucción 'break;' en su código)? ¿O solo para indicarle a gdb que no se detenga nuevamente hasta que salga del bucle? – thkala

Respuesta

2

Desea el comando de avance, que toma los mismos argumentos que el comando de corte. Usando el código de ejemplo (pero con los números de línea añadidos):

10 while (true){ 
11 // do something ... 
12 size_t i = foo(); // <- bp set here 
13 if (flag_set) break; 
14 } 
15 
16 // More code follows here ... 
17 someFunction(); 

Digamos que su punto de ruptura original en la línea 12 fue punto de interrupción 1, y después de romper un par de veces que quería saltar a la línea 17, escribiría algo como:

desactivar 1

avance 17

que desactivar punto de interrupción 1 (para que no se da un golpe para el resto del bucle) y luego seguir la ejecución del programa hasta que llegó a la línea 17.

+0

Eso es exactamente lo que quiero hacer, ¡gracias! – oompahloompah

0

Establezca un segundo punto de interrupción después del ciclo. disable el punto de interrupción dentro del ciclo. cont. enable el punto de interrupción nuevamente.

No sé de ninguna manera más fácil.

0

Intente utilizar el comando jump. Por gdb ayuda, en este sistema, al menos:

jump -- Continue program being debugged at specified line or address 
+0

No no no - ¡eso cambia físicamente el contador del programa! Ni siquiera sé por qué ofrecen esta característica, es tan peligroso. – TonyK

+0

Pero eso es lo que @oompahloompah solicitó: "salte del ciclo while por completo (supongamos que tenemos la garantía de que se establecerá la bandera, para que podamos salir del círculo". – geekosaur

+1

Lo que quiere oompahloompah es una forma de ejecute las iteraciones restantes sin detenerse en el punto de interrupción cada vez. Al menos, así es como lo leí. Consulte mi respuesta para una solución. – TonyK

1

Establecer un punto de interrupción antes del bucle. Luego cursor a la llamada foo(), y use Debug|Run to Line. Esto es tan útil que le he dedicado una tecla de función.

0

Lo que necesita es hasta el comando. Esta es la forma más fácil de evitar el ciclo. De gdb manual:

Continúe ejecutándose hasta que se llegue a una línea de origen más allá de la línea actual, en el marco de la pila actual. Este comando se usa para evitar pasos individuales a través de un bucle más de una vez. Es como el siguiente comando, excepto que cuando hasta que se encuentra con un salto, automáticamente continúa la ejecución hasta que el contador del programa es mayor que la dirección del salto.

Cuestiones relacionadas