Подтвердить что ты не робот

GDB: break, если переменная равная величина

Мне нравится, когда GDB устанавливает точку останова, когда переменная равна некоторому установленному значению, я попробовал этот пример:

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

     return 0;
}

Выход из 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)

Как вы видите, GDB не сделал какой-либо точки останова, возможно ли это с GDB?

4b9b3361

Ответ 1

в дополнение к точке наблюдения, вложенной в точку останова вы также можете установить единую точку останова на "filename: line_number" и использовать условие. Мне иногда бывает легче.

(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);

Если мне нравится, что вы устали от изменения номеров строк, вы можете добавить ярлык затем установите точку останова на ярлыке следующим образом:

#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

Ответ 2

Вы можете использовать контрольную точку для этого (точка останова для данных вместо кода).

Вы можете начать с watch i.
Затем установите для него условие, используя condition <breakpoint num> i == 5

Вы можете получить номер точки останова, используя info watch

Ответ 3

Во-первых, вам нужно скомпилировать ваш код с соответствующими флагами, чтобы включить отладку в коде.

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

затем просто запустите ваш код с вашим любимым отладчиком

$ gdb ./ex1

покажи мне код.

(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   }

разбить на строки 5 и посмотреть, если я == 5.

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

проверка точек останова

(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

запуск программы

(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)

Ответ 4

Существуют контрольные точки аппаратного и программного обеспечения. Они предназначены для чтения и записи переменной. Вам нужно проконсультироваться с учебником:

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

Чтобы установить точку наблюдения, сначала вам нужно разбить код на место, где varialle я присутствует в среде, и установить точку наблюдения.

watch используется для установки сторожевой точки для записи, а rwatch для чтения и awatch для чтения/записи.