2012-04-16 9 views
7

Estoy usando gdb-7.0.1 y creo que he detectado un error en cierta sección de mi código, que tiene un bucle for. El bucle for pareceContinuar una iteración en C++ hasta un número de iteración específico en gdb

for (int i=0 ; i< end ; ++i) 
{ 
    //Code here. 
} 

Aquí end es un muy gran número entero. El código no falla en la primera iteración y parece bloquearse en algún lugar en el número de iteración end/2.

Ya que quiero entender el comportamiento del código en la iteración número end/2, simplemente stepping y nexting de i=0 hasta que llegue a este punto iteración, es inviable.

¿Hay una manera de contar gdb continuar a través de un bucle hasta que consigue i y el valor end/2 luego esperar a que el usuario al paso manualmente a través de número de iteración end/2?

estoy usando gcc-4.5.2 en Ubuntu Linux

+0

http://blog.vinceliu.com/2009/07/gdbs-conditional-breakpoints.html –

Respuesta

5

Cuando establece el punto de interrupción le dará un número de punto de interrupción (por el momento, supongamos que es 1). A continuación, hará que ese punto de corte sea condicional, algo así como:

condition 1 i==end/2 
1

usted debería ser capaz de colocar un if (i == (end/2 -1)) { Foo; } allí a continuación, establezca un punto de interrupción en Foo, lo que permitirá seguir paso a paso desde allí.

+0

+1 como solía ser mi método hasta que encontré puntos de interrupción condicionales como lo sugiere @LuchianGrigore. –

+0

Gracias, sí, no soy lo suficientemente fluido en gdb como para haberlo aprendido. Pensé que era una solución suficientemente genérica para dejarlo incluso frente a los más conmovedores. –

6

Aquí hay un tutorial en conditional breakpoints con gdb.

Supongo que no conocía el término para esto, de lo contrario hubiera sido fácil buscar en Google.

+0

Otra alternativa es '(gdb) ignorar end/2-1' –

1

Si end es grande (en las decenas de miles), entonces el condicional La solución de punto de interrupción puede ser muy lenta: gdb tiene que evaluar la condición cada vez que pasa el ciclo. Si esto es un problema para usted, entonces usted puede utilizar este truco:

for (int i=0 ; i< end ; ++i) 
{ 
    if (i == end/2) 
     i %= end ; // This has no effect, but lets you set a breakpoint here 
    //Code here. 
} 

hago esto todo el tiempo :-)

Otra solución es establecer un pasa-recuento en el punto de interrupción. Uso gdb en un entorno Qt, por lo que no puedo darte la sintaxis gdb. Pero es más rápido que establecer una condición.