GDB: romper si la variable es igual al valor

89

Me gusta hacer que GDB establezca un punto de interrupción cuando una variable es igual a algún valor que establecí, probé este ejemplo:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i)
        printf("%d\n", i);

     return 0;
}

Salida de GDB:

(gdb) break if ((int)i == 5)
No default breakpoint address now.
(gdb) run
Starting program: /home/SIFE/run 
0
1
2
3
4
5
6

Program exited normally.
(gdb)

Como puede ver, GDB no hizo ningún punto de quiebre, ¿es esto posible con GDB?

SIFE
fuente

Respuestas:

123

además de un punto de observación anidado dentro de un punto de interrupción, también puede establecer un único punto de interrupción en el 'nombre de archivo: número de línea' y usar una condición. A veces lo encuentro más fácil.

(gdb) break iter.c:6 if i == 5
Breakpoint 2 at 0x4004dc: file iter.c, line 6.
(gdb) c
Continuing.
0
1
2
3
4

Breakpoint 2, main () at iter.c:6
6           printf("%d\n", i);

Si, como yo, te cansas de cambiar los números de línea, puedes agregar una etiqueta y luego establecer el punto de interrupción en la etiqueta de la siguiente manera:

#include <stdio.h>
main()
{ 
     int i = 0;
     for(i=0;i<7;++i) {
       looping:
        printf("%d\n", i);
     }
     return 0;
}

(gdb) break main:looping if i == 5
mate
fuente
30

Puede usar un punto de observación para esto (un punto de interrupción en los datos en lugar del código).

Puede comenzar usando watch i.
Luego, establezca una condición para ello usandocondition <breakpoint num> i == 5

Puede obtener el número de punto de interrupción utilizando info watch

soy real
fuente
3
(gdb) watch i No symbol "i" in current context.
SIFE
2
Tienes que estar en un lugar del código donde iexista. Intenta break main, run, c, s(paso para asegurarse de que llegue más allá de la declaración), y luego los comandos en la respuesta. Asegúrese de compilar su programa con la -gbandera. (es decir, con información de depuración)
imreal
Antes de que comience la ejecución, es posible que aún no se hayan cargado otras unidades / archivos de compilación vinculados con su ejecutable principal. Una opción es ingenioso para su uso a continuación start <args>, que es como tb main, run <args>. Esto iniciará el programa, lo que le permitirá establecer puntos de interrupción / vigilancia con mayor facilidad.
JWCS
9

Primero, debe compilar su código con los indicadores apropiados, lo que permite la depuración en el código.

$ gcc -Wall -g -ggdb -o ex1 ex1.c

luego simplemente ejecute su código con su depurador favorito

$ gdb ./ex1

muéstrame el código.

(gdb) list
1   #include <stdio.h>
2   int main(void)
3   { 
4     int i = 0;
5     for(i=0;i<7;++i)
6       printf("%d\n", i);
7   
8     return 0;
9   }

rompe en las líneas 5 y mira si i == 5.

(gdb) b 5
Breakpoint 1 at 0x4004fb: file ex1.c, line 5.
(gdb) rwatch i if i==5
Hardware read watchpoint 5: i

comprobar los puntos de interrupción

(gdb) info b
Num     Type           Disp Enb Address            What
1       breakpoint     keep y   0x00000000004004fb in main at ex1.c:5
    breakpoint already hit 1 time
5       read watchpoint keep y                      i
    stop only if i==5

ejecutando el programa

(gdb) c
Continuing.
0
1
2
3
4
Hardware read watchpoint 5: i

Value = 5
0x0000000000400523 in main () at ex1.c:5
5     for(i=0;i<7;++i)
Alexandre Mulatinho
fuente
4

Hay puntos de observación de hardware y software. Son para leer y escribir una variable. Necesitas consultar un tutorial:

http://www.unknownroad.com/rtfm/gdbtut/gdbwatch.html

Para establecer un punto de observación, primero debe dividir el código en un lugar donde el varianle i esté presente en el entorno y establecer el punto de observación.

watchEl comando se usa para establecer un punto de observación para escribir, mientras que rwatchpara leer y awatchpara leer / escribir.

alinsoar
fuente