GDB: прервать, если переменная равна значению

89

Мне нравится заставлять 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?

SIFE
источник

Ответы:

124

в дополнение к точке наблюдения, вложенной внутрь точки останова, вы также можете установить единственную точку останова на «имя_файла: номер_строки» и использовать условие. Иногда мне бывает проще.

(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
матовый
источник
30

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

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

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

я настоящий
источник
3
(gdb) watch i No symbol "i" in current context.
SIFE
2
Вы должны быть в том месте кода, где оно iсуществует. Попробуйте break main, run, c, s(шаг , чтобы убедиться , что вы получите мимо декларации), а затем команды на ответ. Обязательно скомпилируйте свою программу с -gфлагом. (т.е. с отладочной информацией)
imreal
Перед запуском выполнения другие модули / файлы компиляции, связанные с вашим основным исполняемым файлом, могут еще не быть загружены. Изящный вариант заключается в использовании то start <args>, что , как tb main, run <args>. Это запустит программу, что позволит вам более легко устанавливать точки перерыва / просмотра.
JWCS
9

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

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

break в строках 5 и смотрит, если 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

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

(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

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

watchКоманда используется для установки точки наблюдения для записи, rwatchчтения и awatchчтения / записи.

Alinsoar
источник